2013-07-06 10 views
9

चाहे false परोक्ष सूचक लिए परिवर्तित किया जा करने की अनुमति दी है के बीच अलग है बजना ++ और जी ++:झूठी परोक्ष सूचक शून्य पर परिवर्तित

जी ++ - 4.8: हमेशा के साथ या -std = C++ 11

बिना एक चेतावनी

क्लैंग ++ (ट्रंक): बिना चेतावनी अगर सीएस = सी ++ 11, और एक त्रुटि अगर -std = C++ 11

तो कोई भी जानता है कि क्यों g ++ और clang ++ अलग-अलग व्यवहार करते हैं, और कौन सही है? सी ++ मानक (सी ++ 03 और सी ++ 11 दोनों) में पैराग्राफ स्थिति के बारे में बात करते हैं।

धन्यवाद। साथ सी ++ 11 बजना

[hidden ~]$ cat b.cpp 
const char* f() { return false; } 

[hidden ~]$ g++ -c b.cpp 
b.cpp: In function ‘const char* f()’: 
b.cpp:1:26: warning: converting ‘false’ to pointer type ‘const char*’ [-Wconversion-null] 
const char* f() { return false; } 
         ^
[hidden ~]$ g++ -std=c++11 -c b.cpp 
b.cpp: In function ‘const char* f()’: 
b.cpp:1:26: warning: converting ‘false’ to pointer type ‘const char*’ [-Wconversion-null] 
const char* f() { return false; } 
         ^
[hidden ~]$ clang++ -c b.cpp 
b.cpp:1:26: warning: initialization of pointer of type 'const char *' to null from a constant boolean expression [-Wbool-conversion] 
const char* f() { return false; } 
         ^~~~~ 
1 warning generated. 
[hidden ~]$ clang++ -std=c++11 -c b.cpp 
b.cpp:1:26: error: cannot initialize return object of type 'const char *' with an rvalue of type 'bool' 
const char* f() { return false; } 
         ^~~~~ 
1 error generated. 
+0

'clang ++ -std = C++ 03' क्या करता है? – zch

+0

चेतावनी, बिना -std = C++ 11 –

+0

जैसा ही मुझे आश्चर्य है कि यह सभी C++ की सी जड़ें नीचे नहीं आते हैं। सी ++ 03 सी 8 9 के साथ संगत है जिसमें कोई बूल प्रकार नहीं था और 'झूठा' और 'सत्य' केवल मैक्रोज़ होगा; हालांकि सी ++ 11 सी 11 के साथ संगत है जिसमें एक बूल प्रकार होता है और इस प्रकार यह 'झूठी' पर '0' के अन्य उपनाम के रूप में विचार करने के लिए समझ में आता है। –

उत्तर

6

मैं कहना चाहता हूँ सही है:

3.9.1 मौलिक प्रकार [basic.fundamental]

6 प्रकार bool की उपयोगिता को या तो हैं true या false। [नोट: कोई हस्ताक्षरित, हस्ताक्षरित, संक्षिप्त, या लंबे बूल प्रकार या मान नहीं हैं। - अंत नोट] प्रकार बूल के मान अभिन्न प्रचार (4.5) में भाग लेते हैं।

bool मान शून्य नहीं है, तो सूचक शून्य पर नहीं बदला जा सकता:

4,10 सूचक रूपांतरण [conv.ptr]

1 एक नल पॉइंटर लगातार एक अभिन्न है निरंतर अभिव्यक्ति (5.1 9) पूर्णांक प्रकार का प्रावधान जो शून्य का मूल्यांकन करता है या का मूल्य std :: nullptr_t टाइप करता है। एक शून्य सूचक स्थिर को सूचक प्रकार में परिवर्तित किया जा सकता है;

एक अभिन्न पदोन्नति (int को bool) और नल पॉइंटर रूपांतरण से मिलकर रूपांतरण अनुक्रम का सुझाव दे सकता है, लेकिन यह मान्य नहीं होगा:

4 मानक रूपांतरण [रूपा]

1 मानक रूपांतरण अंतर्निहित अर्थ के साथ अंतर्निहित रूपांतरण हैं। क्लॉज 4 इस तरह के रूपांतरणों के पूर्ण सेट को दर्शाता है।

  • शून्य या निम्नलिखित सेट से एक रूपांतरण: lvalue करने वाली rvalue रूपांतरण, सरणी-टू-सूचक रूपांतरण, और समारोह-करने के लिए एक मानक रूपांतरण अनुक्रम क्रम निम्नलिखित में मानक रूपांतरण का एक क्रम है -इंटर रूपांतरण।निम्नलिखित सेट से
  • शून्य या एक रूपांतरण: अभिन्न पदोन्नति, चल बिन्दु पदोन्नति, अभिन्न रूपांतरण, चल बिंदु रूपांतरण, चल अभिन्न रूपांतरण, सूचक रूपांतरण, सदस्य रूपांतरण करने के लिए सूचक है, और बूलियन रूपांतरण ।
  • शून्य या एक योग्यता रूपांतरण।

[नोट: एक मानक रूपांतरण अनुक्रम खाली हो सकता है, यानी, यह में कोई रूपांतरण नहीं हो सकता है। - अंत नोट] मानक रूपांतरण अनुक्रम को आवश्यक गंतव्य प्रकार में परिवर्तित करने के लिए आवश्यक होने पर अभिव्यक्ति पर लागू किया जाएगा।

+1

दोनों कंपाइलर्स इसे सी ++ 03 मोड में अनुमति देते हैं, इसलिए क्लैंग जीसीसी के रूप में गलत है (नोट, मैंने बहुत पहले यह रिपोर्ट की थी, http://www.open-std.org/jtc1/sc22/wg21/docs देखें /cwg_closed.html#1448)। सी ++ 11 में, क्लैंग केवल बाद के मानक में संभावित (?) आने वाले परिवर्तन की वजह से इसकी अनुमति देता है जो किसी भी अभिन्न निरंतर अभिव्यक्ति को सादे "0" को छोड़कर शून्य सूचकांक स्थिरांक होने पर प्रतिबंध लगाएगा। दुर्भाग्यवश निकटतम कारण "अंक 903 का संकल्प यह स्पष्ट करता है कि झूठी शून्य सूचक स्थिर नहीं है।" मेरी समस्या रिपोर्ट के लिए पूरी तरह से अप्रासंगिक है :( –

+0

ठीक है, पूरी तरह से अप्रासंगिक नहीं है, लेकिन यह याद करता है कि वही समस्या 'bool v = true; int a = {v};' - परिभाषा के अनुसार यह "संकुचित" और बीमार- गठित, लेकिन कार्यान्वयन इसे स्वीकार करते हैं। यह आईएमओ "झूठी" और "सत्य" की परिभाषा को स्पष्ट करने के लिए बेहतर होगा कि यहां क्या उद्देश्य है। –

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