मुझे विजुअल स्टूडियो 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' बिना त्रुटि के कोड को संकलित करता है।
'ए()' से '{}' को बदलने का प्रयास करें - यह इससे संबंधित हो सकता है: http://stackoverflow.com/questions/7935639/can-we-return-objects-having-a-deleted-private -कोपी-चाल-कन्स्ट्रक्टर-बाय-वैल्यू-एफ – Pubby
@ पब्बी अच्छा लिंक, लेकिन मुझे लगता है कि यह किसी भी तरह का अलग मुद्दा है। 'एक मेकए();' छोड़ना केवल कोड में और makea() के शरीर को दूसरी फ़ाइल में ले जाने से उल्लिखित परिवर्तन अदृश्य हो जाना चाहिए। 22 वीं लाइन के बिना, कोड संकलित करता है। मुझे लगता है कि यह makeA() फ़ंक्शन की समस्या नहीं है। – kcm1700
99% यकीन है कि यह एक कंपाइलर बग है। कृपया [एमएस कनेक्ट] (https://connect.microsoft.com/VisualStudio/) पर एक बग रिपोर्ट पोस्ट करें और यहां एक लिंक पोस्ट करें। – ildjarn