2011-06-07 14 views
5

मैं nullptr का संकलक समर्थन के लिए इंतज़ार कर थक मिला अनुकरण (gcc 4.6 does लेकिन यह इतना नया कुछ वितरण इसे समर्थन है)।पूरी तरह से nullptr

तो जैसा कि nullptr जब तक एक को रोकने के अंतर को पूरी तरह से समर्थित है मैं इसे का अनुकरण करने का फैसला किया। इम्यूलेशन के दो उदाहरण हैं: here से, और wikibooks में से एक।

ध्यान दें

, न तो कार्यान्वयन एक operator == का उल्लेख है। हालांकि, एक के बिना, निम्नलिखित कोड will not compile

int* ptr = nullptr; 
assert(ptr == nullptr); // error here: missing operator == 

इस operator == त्रुटि एक संकलक बग है?
operator == (और !=, <, <=, आदि) को nullptr का अधिक अनुकरण करने की आवश्यकता है?
नकली nullptr और असली सौदा के बीच और क्या अंतर है?

+2

आप 'assert (ptr) के बजाय ऐसा क्यों करेंगे;' पहले स्थान पर? – ildjarn

+0

@ नील बटरवर्थ: यह सच नहीं है। 'nullptr' को मानक का हिस्सा होना चाहिए क्योंकि इसमें केवल तभी मूल्य होता है जब सभी एक ही शून्य सूचक प्रकार-' std :: nullptr_t' का उपयोग करते हैं। अगर हर कोई अपना खुद का शून्य सूचक लागू करता है, तो आप एक ऐसा फ़ंक्शन कैसे लिखेंगे जो शून्य सूचक को स्वीकार करेगा? आप नहीं जानते कि शून्य सूचक प्रकार क्या है। – Puppy

+0

@ildjarn: मैंने कोड को साफ करने के लिए एक दावा किया था। मेरा वास्तविक उदाहरण 'std :: remove (v.begin(), v.end(), nullptr था; 'जो समानता ऑपरेटर का उपयोग करता है। और कारण मैं सिर्फ 'std :: remove_if' का उपयोग नहीं करता हूं, मैं नहीं चाहता हूं। मैं चाहता हूं कि यह सिर्फ वास्तविक 'nullptr' की तरह काम करे। –

उत्तर

2

आपने इसे C++ 0x कंपाइलर के साथ संकलित किया जो अज्ञात कारण के लिए विफल रहा। यह compiles fine in C++03 है।

+0

तो, मेरे मूल प्रश्न पर वापस। क्या यह त्रुटि नए सी ++ 0x भाषा नियमों का प्रभाव है? या यह एक बग है जिसे जीसीसी में पेश किया गया था जब अन्य सी ++ 0 एक्स फीचर्स जोड़े गए थे? –

+2

@deft_code: 1) आपका कोड अमान्य C++ 0x है क्योंकि यह कीवर्ड nullptr का उपयोग करता है। 2) मुझे 9 0% यकीन है कि यह एक जीसीसी बग है 3) पहले से ही एक [समान बग] था (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33990)। – ybungalobill

+0

उस बग के साथ बढ़िया खोज। मेरा [सटीक त्रुटि केस] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33990#c4) टिप्पणियों में सूचीबद्ध है। बिंदु 1 के जवाब में मुझे _no duh कहना होगा! _ यह पूरी तरह से अनुपालन सी ++ 0x कंपाइलर में स्पष्ट रूप से अमान्य है। जीसीसी 4.5 अभी तक पूरी तरह से अनुपालन नहीं है, और इसलिए मुझे एक कीवर्ड अनुकरण करने की आवश्यकता है। –

1

हां, आपको ऐसी चीज लागू करनी चाहिए। हालांकि, मुझे हैरान है कि निहित रूपांतरण ऑपरेटर लात मार रहे हैं और आपको एक स्पष्ट ऑपरेटर प्रदान किए बिना तुलना करने की इजाजत नहीं दे रहे हैं।

template<typename T> bool operator==(T* ptr, nullptr_t null) { 
    return ptr == 0; 
} 
template<typename C, typename R> bool operator==(R C::* ptr, nullptr_t null) { 
    return ptr == 0; 
} 
// And the reverse 
1

यह वास्तव में अपना पहला उदाहरण संदर्भ से आधिकारिक प्रस्ताव में उल्लेख किया गया है: कई लोकप्रिय मौजूदा compilers के साथ

प्रयोगों चलता है कि यह के कई के लिए गरीब और/या भ्रामक संकलक निदान उत्पन्न करता है सामान्य उपयोग के मामलों खंड 2 में वर्णित (उदाहरणों में शामिल हैं: स्थिरांक "से" पूर्णांक "" से कोई रूपांतरण ""; "से कोई उपयुक्त रूपांतरण समारोह" स्थिरांक कक्षा "से" int " मौजूद है"; "एक टेम्पलेट तर्क एक अनाम प्रकार का संदर्भ नहीं दे सकता है"; "कोई ऑपरेटर" == "इन ऑपरेंड से मेल खाता है, संकार्य प्रकार हैं: पूर्णांक == स्थिरांक वर्ग ") हम मानते हैं कि compilers अभी भी आदेश के लिए गुणवत्ता diagnos- tics प्रदान करने के लिए nullptr की विशेष ज्ञान जोड़ने की आवश्यकता होगी। सामान्य उपयोग के मामलों।

तो यदि संकलक अभी तक नहीं है तो आपको यह अंतर स्वयं भरना चाहिए।

+0

वह खराब कंपाइलर डायग्नोस्टिक्स चर्चा एक अज्ञात 'nullptr' प्रकार के संदर्भ में है। हालांकि, मानकों समिति ने फैसला किया कि 'nullptr' प्रकार 'nullptr_t' होगा।उन सभी गुप्त त्रुटि संदेशों को बहुत बेहतर मिलता है जब 'nullptr' वर्ग' nullptr_t' नाम दिया जाता है। –

+0

@deft_code - तो फिर समस्या क्या है? – littleadv