2017-05-05 14 views
8

मैंने 3 कंपेलरों के साथ निम्न कोड का परीक्षण किया और 3 अलग-अलग परिणाम प्राप्त किए: त्रुटि, चेतावनी और ठीक है।nullptr_t से bool तक रूपांतरण: मान्य या नहीं?

  • जीसीसी (5.3): त्रुटि: चेतावनी: 'bool' के लिए nullptr निरंतर की अंतर्निहित रूपांतरण 'std :: nullptr_t' 'स्थिरांक बात &'
  • बजना (3.8) से अमान्य उपयोगकर्ता-निर्धारित रूपांतरण
  • MSVC (14.1): कोई त्रुटि, तो कोई चेतावनी

कौन सा संकलक सही है? मुझे पता है कि यह एक सूचक प्रकार और bool के बीच एक मामूली रूपांतरण है। लेकिन std::nullptr_t और bool के बारे में क्या है?

(अंत में, बजना और MSVC कोड के साथ दोनों ठीक हैं। बजना एक छोटा सा एक सकारात्मक रास्ते में अधिक वर्बोज़ है।)

struct Thing 
{ 
    Thing(bool) {} 
}; 

void addThing(const Thing&){} 

int main() 
{ 
    addThing(nullptr); // warning or error on this line 
} 

उत्तर

8

यह अवैध है। जिसके द्वारा एक समारोह के लिए तर्क पारित करने के लिए मामले सहित मानक से

A prvalue of type std::nullptr_t , including nullptr , can be converted to a prvalue of type bool in context of direct-initialization. The resulting value is false .

उद्धरण, §7.14/1 Boolean conversions [conv.bool]

For direct-initialization, a prvalue of type std​::​nullptr_­t can be converted to a prvalue of type bool ; the resulting value is false .

रूपांतरण केवल direct-initialization के लिए अनुमति दी है, लेकिन नहीं copy-intialization,: boolean conversions के नियम के अनुसार मूल्य। जैसे

bool b1 = nullptr; // invalid 
bool b2 {nullptr}; // valid 

तो जीसीसी सही है। लेकिन क्लैंग गलत नहीं है; जब मानक खराब हो जाता है तो मानक को केवल "डायग्नोस्टिक जारी करने" के लिए संकलक की आवश्यकता होती है, इसलिए यह आपको कुछ बताना होगा, उसके बाद यह कुछ भी कर सकता है।

Does the C++ standard specify that for some cases the compiling should fail with an error?

+0

देखें मैं केवल तार्किक अंतर दिखाई से परेशान एक हूँ? (जवाब स्वयं नहीं)। मुझे यकीन है कि इसे अन्य कारणों से लागू किया गया था, लेकिन यह * वास्तव में * मुझे ऐसे मामले के रूप में हमला करता है जहां न ही '_cast' ऑपरेटर की अनुपस्थिति में काम करना चाहिए। –

+1

@ ब्रेटहेल मेरी व्याख्या यह है कि 'नलप्टर' को केवल शून्य सूचक (किसी भी सूचक प्रकार और सदस्य प्रकार के लिए कोई सूचक) में रूपांतरित किया जा सकता है। 'बूल' में रूपांतरण स्पष्ट होना चाहिए, लेकिन फिर भी अनुमति है (अन्य पॉइंटर्स की स्थिरता के लिए?)। – songyuanyao

+1

@ ब्रेट हेल मैं इसे असंगत के रूप में नहीं देखता हूं। एक कन्स्ट्रक्टर को स्पष्ट रूप से कॉल करना, आश्चर्यचकित आश्चर्य, रचनाकारों को कॉल करना जिन्हें स्पष्ट रूप से चिह्नित किया गया है, जो कि स्थिर कलाकारों की एक चीज है! ये आदिम प्रकार हैं इसलिए उनके पास सचमुच रचनाकार नहीं हैं लेकिन विचार समान है। –

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