2013-04-12 4 views
12

SonoPer restituire std :: move (x) o no?

std::vector<double> foo() 
{ 
    std::vector<double> t; 
    ... 

    return t; 
} 

e

std::vector<double> foo() 
{ 
    std::vector<double> t; 
    ... 

    return std::move (t); 
} 

equivalente?

Più precisamente, è return x sempre equivalente a return std::move (x)?

risposta

14

Non sono equivalenti e si dovrebbe sempre usare return t;.

La versione più lunga è che, se e solo se l'istruzione return è ammissibile per l'ottimizzazione valore di ritorno, quindi il migrante si lega a rvalue di riferimento (o colloquialmente, "il move è implicito").

Complicando return std::move(t);, tuttavia, si inibisce effettivamente l'ottimizzazione del valore di ritorno!