2012-06-04 16 views
8

मुझे विजुअल स्टूडियो 2010 सी ++ के साथ निम्नलिखित कोड में परेशानी हो रही है।ऑब्जेक्ट जेनरेटर कॉल के आर-वैल्यू संदर्भ में कॉपी कन्स्ट्रक्टर की आवश्यकता क्यों होती है?

makeA() सी में सिर्फ एक वस्तु जनरेटर मुहावरा है ++ (जैसे std :: make_pair)

#include <stdio.h> 

struct A{ // 7th line 
    A() {} 
    A(A &&) {printf("move\n");} 
    ~A() {printf("~A();\n");} 
private: 
    A(const A &) {printf("copy\n");} // 12th line 
}; 

A makeA() 
{ 
    return A(); 
} 

int main() 
{ 
    A &&rrefA(makeA()); // 22nd line 
    return 0; 
} 

त्रुटि संदेश

2>d:\test.cpp(22): error C2248: 'A::A' : cannot access private member declared in class 'A' 
2>   d:\test.cpp(12) : see declaration of 'A::A' 
2>   d:\test.cpp(7) : see declaration of 'A' 
2> 

मैं makeA() दोनों एक() निर्माता फोन करने की उम्मीद और ए (ए & &) कन्स्ट्रक्टर, और 22 ए लाइन मेकए() और कुछ भी नहीं कहने के लिए। (यदि आरवीओ के बिना) कंपाइलर को ए (कॉन्स ए &) कन्स्ट्रक्टर की पहुंच की आवश्यकता नहीं है, तो क्या मैं सही हूँ?

क्या आप मुझे बता सकते हैं कि कोड के साथ क्या गलत है?

जी ++ के हाल के संस्करण के साथ, 'g ++ -std = C++ 0x' और 'g ++ -std = C++ 0x -fno-elide-constructors' बिना त्रुटि के कोड को संकलित करता है।

+0

'ए()' से '{}' को बदलने का प्रयास करें - यह इससे संबंधित हो सकता है: http://stackoverflow.com/questions/7935639/can-we-return-objects-having-a-deleted-private -कोपी-चाल-कन्स्ट्रक्टर-बाय-वैल्यू-एफ – Pubby

+0

@ पब्बी अच्छा लिंक, लेकिन मुझे लगता है कि यह किसी भी तरह का अलग मुद्दा है। 'एक मेकए();' छोड़ना केवल कोड में और makea() के शरीर को दूसरी फ़ाइल में ले जाने से उल्लिखित परिवर्तन अदृश्य हो जाना चाहिए। 22 वीं लाइन के बिना, कोड संकलित करता है। मुझे लगता है कि यह makeA() फ़ंक्शन की समस्या नहीं है। – kcm1700

+1

99% यकीन है कि यह एक कंपाइलर बग है। कृपया [एमएस कनेक्ट] (https://connect.microsoft.com/VisualStudio/) पर एक बग रिपोर्ट पोस्ट करें और यहां एक लिंक पोस्ट करें। – ildjarn

उत्तर

4

यह अनुकूलक में एक बग है। संकलक इस कदम को आगे बढ़ाने का प्रयास करता है, लेकिन केवल एक प्रतिलिपि बनाने के लिए प्रोग्राम किया जाता है- जिसके लिए एक प्रतिलिपि बनाने की आवश्यकता होती है जो पहले स्थान पर मौजूद है।

मुझे याद नहीं है कि (अगर कोई है) इस त्रुटि के लिए ठीक है, लेकिन यह एसपी 1 में तय किया गया हो सकता है।

+0

वीसी ++ 2010 एसपी 1 में तय नहीं है। शायद वीसी 11 में? – ildjarn

+1

मैंने वीएस 2012 आरसी स्थापित किया है और कोड काम कर रहा है। यह वीएस2012 में तय है। धन्यवाद। – kcm1700

+0

ओह, यह काम करता है अगर कॉपी कन्स्ट्रक्टर परिभाषित नहीं किया गया है, मुझे लगता है, लेकिन अभी भी सार्वजनिक रूप से सुलभ है। – Puppy

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

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