2013-06-23 11 views
8

Bu kod VS2010'da derlenmiyor. C2440 hatası veriyor: 'argüman': 'A'dan' A & '' a dönüşemez, ancak Standarttaki 12.8p2'ye göre A::A(A&) geçerli bir kopya oluşturucusudur ve a, main() içinde A b = foo(a); ifadesindeki bir değerdir.Bu kod Standarttaki 12.8p2'ye göre derlenmemeli mi?

#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

GCC 4.7.2'de derler ve çalışır. – interjay

+0

Geri dönüş değerini foo() 'dan b'ye kopyalamak için hareket ctor'unu çağırır mı? – Belloc

+0

Evet, buraya bakın: http://ideone.com/Ykwm2Z – interjay

cevap

2

Bunun hakkında konuştuğunuz standarda bağlı olduğunu söyleyebilirim. C++ 11 varsayarsak o zaman benim almak Tamam olmalı ve şu sonucu gerektiğidir:

Eğer foo içine iletilir a işaret olarak
Constructor <- Construction of 'a' in main 
Copy ctor <- Construction of 'a' in foo 
Move ctor <- Move from foo's return value into b 

bir lvalue olduğunu. Ancak, foo'dan geri dönüş değeri bir değerdir ve bu nedenle, ön C++ 11 kasasında A & kopya yapıcısını (varolmayan) veya C++ 11 kasasında hareket yapıcısını çağırmalıdır.