2015-05-15 11 views
6

तो आज मैंने बग को खोजने के लिए काफी कठिन लिखा जहां मैंने std :: string को nullptr में प्रारंभ किया (std :: स्ट्रिंग के लिए पॉइंटर नहीं, बल्कि मान स्वयं)। मुझे स्पष्ट रूप से पता चला है कि सी ++ 11 या बाद में क्लैंग के साथ करना संभव है।आप std :: स्ट्रिंग को nullptr क्यों असाइन कर सकते हैं?

#include <string> 
#include <iostream> 

using namespace std; 
class Meh{ 
    int x; 
}; 
class Foo 
{ 
private: 
    std::string x=nullptr; 
    Meh y=nullptr; //remove this line and it compiles 
public: 
    std::string z=nullptr; 
}; 

int main(void) 
{ 
    Foo f; 
    cout << f.z; 
    return 0; 
} 

जैसा कि आप देख सकते हैं, मैंने कक्षा के केवल एक यादृच्छिक उदाहरण के लिए nullptr असाइन करने का प्रयास किया और यह काम नहीं किया। स्ट्रिंग में कौन सा जादू है जो इसे काम करने की अनुमति देता है, और यह किस तरह से वैध वाक्यविन्यास है? मुझे लगता है कि इस मामले में मुझे एक प्रकार कास्टिंग त्रुटि से मुलाकात की जाएगी।

संदर्भ के लिए मैं इस के साथ संकलित:

clang++ test.cpp -O3 -g -fno-inline -std=c++11 -Wall 

यह चेतावनी की कोई रूप नहीं दिया, हालांकि यह बाहर त्रुटि होगा यदि का उपयोग नहीं सी ++ 11

उत्तर

13

बस है ऐसा इसलिए है क्योंकि वहाँ constructors (संख्या (हैं 5) लिंक में) और assignment operators (लिंक में संख्या (3)) std::string के लिए जो const char* स्वीकार करता है, और इसलिए nullptr मैचों को स्वीकार करता है।

सी ++ 11 से पहले (और इसलिए nullptr से पहले), वही समस्या तब हुई जब आपने 0 या NULL से निर्माण करने का प्रयास किया। ये सभी मामले अवैध थे और परिणामस्वरूप अपरिभाषित व्यवहार में, हालांकि कम से कम एक एसटीएल (रोगवेव?) ने इसे अतीत में स्वीकार कर लिया और एक खाली स्ट्रिंग उत्पन्न की।

+6

यह ध्यान देने योग्य है कि यह अनिर्धारित व्यवहार ™ – Puppy

+0

क्यों यह सी ++ 11 से पहले काम नहीं करता है? – Earlz

+0

@Earlz 'nullptr' C++ 11 से पहले मौजूद नहीं था। – hvd

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

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