यह कोड VS2010 में संकलित नहीं है। यह उत्सर्जन करता है त्रुटि C2440: 'तर्क': 'ए' से करने के लिए 'ए &' परिवर्तित नहीं कर सकते, लेकिन स्टैंडर्ड में 12.8p2 के अनुसार, A::A(A&)
मान्य प्रतिलिपि निर्माता है और a
main()
में अभिव्यक्ति A b = foo(a);
में एक lvalue है।क्या यह कोड मानक में 12.8p2 के अनुसार संकलित नहीं होना चाहिए?
#include <iostream>
class A
{
public:
int x;
A(int a) { x = a; std::cout << "Constructor\n"; }
A(A& other) { x = other.x; std::cout << "Copy ctor\n"; }
A(A&& other) { x = other.x; other.x = 0; std::cout << "Move ctor\n"; }
};
A foo(A a)
{
return a;
}
int main(void)
{
A a(5);
A b = foo(a);
}
जीसीसी 4.7.2 में संकलित और ठीक चलाता है। – interjay
क्या यह चाल ctor को foo() से b पर वापसी मान की प्रतिलिपि बनाने के लिए कहते हैं? – Belloc
हां, यहां देखें: http://ideone.com/Ykwm2Z – interjay