2013-06-23 7 views
8

यह कोड VS2010 में संकलित नहीं है। यह उत्सर्जन करता है त्रुटि C2440: 'तर्क': 'ए' से करने के लिए 'ए &' परिवर्तित नहीं कर सकते, लेकिन स्टैंडर्ड में 12.8p2 के अनुसार, A::A(A&) मान्य प्रतिलिपि निर्माता है और amain() में अभिव्यक्ति 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); 
} 
+5

जीसीसी 4.7.2 में संकलित और ठीक चलाता है। – interjay

+0

क्या यह चाल ctor को foo() से b पर वापसी मान की प्रतिलिपि बनाने के लिए कहते हैं? – Belloc

+0

हां, यहां देखें: http://ideone.com/Ykwm2Z – interjay

उत्तर

2

मैं कहूंगा कि यह इस बात पर निर्भर करता है कि आप किस मानक के बारे में बात कर रहे हैं। सी ++ 11 मान लिया जाये तो मेरे ले कि यह ठीक होना चाहिए और निम्न परिणाम उपज चाहिए:

Constructor <- Construction of 'a' in main 
Copy ctor <- Construction of 'a' in foo 
Move ctor <- Move from foo's return value into b 

आप foo में पारित हो जाता है कि एक का कहना है के रूप में एक lvalue है। हालांकि, foo से रिटर्न वैल्यू एक रैवल्यू है और इसलिए इसे पहले सी ++ 11 मामले में कॉन्स ए & कॉपी कन्स्ट्रक्टर (अस्तित्वहीन) या सी ++ 11 मामले में चालक कन्स्ट्रक्टर का आह्वान करना चाहिए।

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