2013-06-20 3 views
7

मैं एक जटिल परिस्थिति पर ठोकर खाई जहां मुझे एक स्पष्ट संकुचन रूपांतरण मिला है, लेकिन मुझे निराश है कि संकलक (जीसीसी -4.7.2) -Wall -Wnarrowing -pedantic झंडे के बावजूद चेतावनी नहीं उठाया। कृपया निम्नलिखित कार्यक्रम देखें:कोष्ठक के साथ प्रारंभ करते समय संकुचित करने के लिए कोई चेतावनी

struct A { 
    int m; 
    A(int m) : m(m) {}; 
}; 

int main() { 
    unsigned long v = 0; 
    A a1(v); // narrowing, but no warning (should this not cause a warning?) 
    A a2{v}; // narrowing, warning raised (expected) 
} 

a1 के प्रारंभ संकलक से एक झलक के रूप में इतना बिना उड़ान भरने के लिए लगता है। बस यह सुनिश्चित करने के लिए कि मैं पागल नहीं जा रहा था, मैंने उसी तरीके से a1 प्रारंभ करने की कोशिश की, लेकिन माता-पिता के बजाय ब्रेसिज़ के साथ। संकलक दूसरे मामले में संकुचन के बारे में चेतावनी देता है, जैसा कि अपेक्षित था।

स्पष्ट होने के लिए: मैं प्रारंभिकरण-सूचियों में रूपांतरण को कम करने की वैधता के बारे में नहीं पूछ रहा हूं। मुझे पता है कि यह कानूनी नहीं है - a2 का घुंघराले-प्रारंभिक प्रारंभिकता केवल एक स्वच्छता जांच थी। मेरा प्रश्न प्रारंभिक सूचियों से संबंधित नहीं है। यह एक डुप्लिकेट सवाल नहीं है।

क्या संकलक मुझे a1 की शुरुआत के लिए संकुचित करने के बारे में चेतावनी नहीं देना चाहिए?

+0

'ए 1 'के लिए कन्स्ट्रक्टर एक अंतर्निहित रूपांतरण कर सकता है, जबकि' ए 2 'के लिए नहीं हो सकता है। आपको क्यों लगता है कि वे वही होना चाहिए? –

+1

क्या होगा यदि आप '-Wconversion' ध्वज जोड़ते हैं? –

+0

यह एक डुप्लिकेट नहीं है। मुझे पहले से ही पता है कि प्रारंभिक सूचियों के भीतर रूपांतरण को सीमित करना अवैध है। मैं कोष्ठक के साथ प्रारंभिकizaiton के बारे में पूछ रहा हूँ। –

उत्तर

2

Wsign-conversion कोड की है कि लाइन के लिए एक चेतावनी उत्पन्न होगा - -Wconversion होगा unsigned long और int एक ही आकार (जो कई प्लेटफार्मों पर सच है, यहां तक ​​कि कुछ 64-बिट प्लेटफॉर्म) हैं तो नहीं। सी कोड के लिए, -Wconversion-Wsign-conversion को स्पष्ट रूप से सक्षम करेगा, लेकिन यह किसी कारण से सी ++ के साथ नहीं होता है।

आप long long करने के लिए v के प्रकार बदलते हैं, तो -Wconversion अपने आप में एक चेतावनी (यह सोचते हैं कि int 32-बिट है) उत्पन्न होगा।

+0

आपकी अंतर्दृष्टि के लिए बहुत बहुत धन्यवाद। मुझे खुशी है कि प्रारंभकर्ता सूची सेमेन्टिक्स रूपांतरणों के बारे में बहुत विशिष्ट है - यह मेरे लिए सबसे अच्छा पोर्टेबल होने के लिए कोड की आवश्यकता होने पर '{}' का उपयोग करना शुरू करने का एक अच्छा कारण हो सकता है ताकि संकलक वास्तव में लक्षित करने से पहले रूपांतरण समस्याएं पकड़ सकें एक नया मंच –

संबंधित मुद्दे