2013-06-23 13 views
8

Questo codice non viene compilato in VS2010. Emette errore C2440: 'argomento': non può convertire da 'A' a 'A &', ma secondo 12.8p2 nello Standard, A::A(A&) è un costruttore di copia valido e a è un lvalue nell'espressione A b = foo(a); in main().Questo codice non dovrebbe essere compilato secondo 12.8p2 nello Standard?

#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

Compila e funziona correttamente in GCC 4.7.2. – interjay

+0

Chiama lo spostatore, per copiare il valore di ritorno da foo() a b? – Belloc

+0

Sì, guarda qui: http://ideone.com/Ykwm2Z – interjay

risposta

2

Direi che dipende dallo standard di cui si sta parlando. Supponendo che C++ 11, allora il mio prendere è che dovrebbe essere OK e dovrebbe produrre il seguente risultato:

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

Come vi segnalo l'una che viene passato nella foo è un lvalue. Tuttavia, il valore restituito da foo è un valore rvalore e dovrebbe pertanto richiamare il costruttore di copie const A & (inesistente) nel caso pre C++ 11 o il costruttore di movimento nel caso C++ 11.

Problemi correlati