N2628c++0x से संबंधित, गैर स्थैतिक डेटा सदस्य प्रारंभकर्ताओं को स्पष्ट रूप से परिभाषित रचनाकारों द्वारा ओवरराइड किया जा सकता है, लेकिन यह स्पष्ट रूप से परिभाषित प्रतिलिपि निर्माता के बारे में थोड़ा अस्पष्ट प्रतीत होता है।सी ++ 0x में, गैर स्थैतिक डेटा सदस्य प्रारंभकर्ता निहित प्रतिलिपि निर्माता को ओवरराइड करते हैं?
विशेष रूप से, मैंने देखा है कि ऐप्पल क्लैंग संस्करण 3.0 के साथ, व्यवहार इस बात पर निर्भर करता है कि संरचना (या कक्षा) एक पीओडी है या नहीं।
निम्नलिखित प्रोग्राम आउटपुट "1" देता है, जो इंगित करता है कि कॉपी-कन्स्ट्रक्टर दाएं हाथ की तरफ अनदेखा कर रहा है, और इसके बजाय नए गैर स्थैतिक डेटा सदस्य प्रारंभकर्ता को प्रतिस्थापित कर रहा है (इस उदाहरण में, बूलियन के लिए सही मूल्य एक्स :: क)।
#include <iostream>
#include <string>
struct X
{
std::string string1;
bool a = true;
};
int main(int argc, char *argv[])
{
X x;
x.a = false;
X y(x);
std::cout << y.a << std::endl;
}
हालांकि, संदेहास्पद रूप से यदि आप string1 बाहर टिप्पणी:
// std::string string1;
तो व्यवहार में काम करता है के रूप में मैं उम्मीद, शायद कोई परोक्ष उत्पन्न क्योंकि वहाँ है कॉपी-निर्माता (उत्पादन "0" है) , और इसलिए डेटा कॉपी किया गया है।
क्या सी ++ 0x विनिर्देश वास्तव में सुझाव देता है कि अंतर्निहित परिभाषित प्रति-निर्माता को पर दाएं हाथ की सामग्री की प्रतिलिपि बनाने का अच्छा विचार है? क्या वह कम उपयोगी और अनजान नहीं है? मुझे गैर स्थैतिक सदस्य प्रारंभकर्ता कार्यक्षमता काफी सुविधाजनक होने के लिए मिलती है, लेकिन यदि यह सही व्यवहार है, तो मैं इसके कठिन और अनजान व्यवहार के कारण स्पष्ट रूप से सुविधा से बचूंगा।
कृपया मुझे बताएं कि मैं गलत हूं?
अद्यतन: यह बग क्लैंग स्रोत भंडार में तय किया गया है। यह revision देखें।
अद्यतन: यह बग ऐप्पल क्लैंग संस्करण 3.1 (टैग/ऐप्पल/क्लैंग -318.0.45) (एलएलवीएम 3.1 एसवीएन पर आधारित) में तय होता है। क्लैंग के इस संस्करण को शेर के लिए एक्सकोड 4.3 के हिस्से के रूप में वितरित किया गया था।
+1 नेबुलोसिटी –