2013-06-23 11 views
8

Ten kod nie jest kompilowany w VS2010. Występuje błąd C2440: "argument": nie można przekonwertować z "A" na "A &", ale zgodnie z 12.8p2 w standardzie, A::A(A&) jest prawidłowym konstruktorem kopii, a a jest lwartością w wyrażeniu A b = foo(a); w main().Czy ten kod nie powinien być kompilowany zgodnie z 12.8p2 w standardzie?

#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

kompiluje i działa poprawnie w GCC 4.7.2. – interjay

+0

Czy wywołuje on ctor ruchu, aby skopiować wartość zwracaną z foo() do b? – Belloc

+0

Tak, patrz tutaj: http://ideone.com/Ykwm2Z – interjay

Odpowiedz

2

Powiedziałbym, że to zależy od standardu, o którym mówisz. Zakładając C++ 11 wtedy moje zdanie jest, że powinno być OK i powinien produkować następujący wynik:

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

Jak wskazują na A, która jest przekazywana do foo jest lwartością. Jednakże wartość powrotna z foo rvalue i powinno wywołać albo const & kopii konstruktor (brak) w uprzednio C++ 11 Wariant lub konstruktora ruch w C++ 11 obudowy.

Powiązane problemy