consideri il seguente:Perché utilizzare il costruttore di mosse in un'istruzione di reso legale?
#include <iostream>
#define trace(name) std::cout << #name << " (" << this << "), i = " << i << std::endl
class C
{
C(C const&);
C& operator=(C const&);
public:
int i;
C() : i(42) { trace(CTOR); }
C(C&& other) : i(other.i) { trace(MOVE); other.i = 0; }
C& operator=(C&& other) { trace(ASGN); other.i = 0; return *this; }
~C() { trace(DTOR); }
};
C
func1(bool c)
{
C local;
if (c)
return local;
else
return C();
}
int
main()
{
C local(func1(true));
return 0;
}
Sia MSC e g ++ consentire return local
, e utilizzare il costruttore spostamento (come indicato dalla uscita) quando farlo. Mentre questo ha molto senso per me, e penso che probabilmente dovrebbe essere il caso, non riesco a trovare il testo nello standard che lo autorizza. Per quanto posso vedere, l'argomento del costruttore di move deve essere un valore di prvalue (che chiaramente non è) o un valore di x; è in realtà un lvalue, che renderebbe il ritorno altrettanto illegale come C other = local;
nel corpo della funzione (che non riesce a compilare).
http://en.wikipedia.org/wiki/Return_value_optimization – IdeaHat
Spiegazione qui: http://en.wikipedia.org/wiki/Return_value_optimization –
Questo non sta eseguendo RVO. ** e utilizzare il costruttore di movimento (come mostrato dall'output) ** – chris