2012-10-09 34 views
8

संभव डुप्लिकेट:
std::string x(x);आप जिस ऑब्जेक्ट को बना रहे हैं उसमें आप एक प्रतिलिपि बनाने वाले को कॉपी कर सकते हैं? (C++) (जीसीसी)

class A {}; 

int main() { 

    A a(a); 
} 

यह संकलित करता है।

जीसीसी (जीसीसी) 4.7.2 20,120,921 (रेड हैट 4.7.2-2)
g++ -o main main.cpp -Wall -w -ansi

मुझे कोई चेतावनियां प्राप्त हुईं।

यह वैध C++ क्यों प्रतीत होता है?
क्या यह मानक में कहीं भी उल्लेख किया गया है?
क्या चेतावनी झंडे हैं जो जीसीसी के लिए इसकी रिपोर्ट कर सकते हैं?

जब कक्षा के सदस्य डेटा होते हैं, तो डेटा यादृच्छिक रूप से समाप्त होता है।
उदाहरण:

#include <iostream> 

class A { 

public: 
    int i; 
    A() : i{6} {} 
}; 

int main() { 

    A a(a); 
    std::cout << a.i << '\n'; 
} 

उत्पादन: -482728464

यहाँ क्या हो रहा है? इसके अलावा, मैं खुद को गलती से ऐसा करने से कैसे रोक सकता हूं? - क्या यह एक कंपाइलर त्रुटि बनाना संभव है?

+2

सरल उदाहरण, 'int i = i;' नोट करें। – GManNickG

+1

क्लैंग 3.2 ने हाल ही में ऐसे मामलों का पता लगाने के लिए अपने एल्गोरिदम की समीक्षा की है, आप [uninitialized.cpp] (http://llvm.org/svn/llvm-project/cfe/trunk/test/SemaCXX/uninitialized.cpp) फ़ाइल देख सकते हैं टेस्ट सूट से सभी मामलों को देखने के लिए जिसमें यह चेतावनी देता है। ध्यान रखें कि जीसीसी के साथ, * अनियमित * चेतावनियां संभावित रूप से अनुकूलन स्तर से बंधी हुई हैं और केवल 'ओ 1' या 'ओ 2' बिल्डों के लिए ट्रिगर की जा सकती हैं। –

उत्तर

10

(§ 3.3.2/1) एक नाम के लिए घोषणा की बिंदु तुरंत अपनी पूर्ण declarator (क्लॉज 8) के बाद और उसके प्रारंभकर्ता (यदि हो तो) से पहले है, के रूप में नीचे उल्लिखित को छोड़कर। [उदाहरण:

int x = 12; 
{ int x = x; } 

यहां दूसरा एक्स अपने स्वयं के (अनिश्चित) मूल्य के साथ शुरू किया गया है। उदाहरण के लिए]

यह उपयोगकर्ता द्वारा परिभाषित प्रकारों पर लागू होता है, जैसे आपके class A, साथ ही साथ। प्रतिलिपि बनाई गई कॉपी कन्स्ट्रक्टर डिफ़ॉल्ट है, जो कंपाइलर द्वारा स्वतः उत्पन्न होती है।