ho una classe A
che stampa un messaggio quando costruito/copiati/spostatimovimento std :: funzione in un altro std :: funzione non richiama il costruttore mossa variabili catturati
class A
{
public:
A(std::string s)
:s_(s)
{
std::cout << "A constructed\n";
}
~A()
{
std::cout << "A destructed\n";
}
A(const A& a)
:s_(a.s_)
{
std::cout << "A copy constructed\n";
}
A(A&& a)
:s_(std::move(a.s_))
{
std::cout << "A moved\n";
}
A& operator=(const A& a)
{
s_ = a.s_;
std::cout << "A copy assigned\n";
}
A& operator=(A&& a)
{
s_ = std::move(a.s_);
std::cout << "A move assigned\n";
}
std::string s_;
};
In main
, costruisco un'istanza di A
, cattura che in un lambda per valore, copiare che lambda in un std::function
, e infine mossa che std::function
in un'altra std::function
int main()
{
A a("hello ");
std::function<void()> f = [a]{ std::cout << a.s_; };
std::function<void()> g(std::move(f));
}
Questo stampa i seguenti
A constructed
A copy constructed
A copy constructed
A destructed
A destructed
A destructed
Perché il costruttore mossa di A
non invocato? L'ultimo passaggio dello spostamento di f
in g
non ha dovuto richiamare il costruttore di spostamenti di A
?
coliru lo muove: http://coliru.stacked-crooked.com/a/9815dc53d6fe8a7e. Dubito che lo standard stabilisca esattamente cosa dovrebbe accadere qui, e apparentemente Microsoft ha scelto di copiare anziché spostare. – dlf
Non ha nemmeno invocato il costruttore di copie. L'atto di costruire 'g' non ha chiamato nessun costruttore di' A' – tcb
Hai ragione; Pensavo che il secondo "Una copia costruita" provenisse dalla costruzione di 'g', ma in realtà il primo è dalla cattura lambda e il secondo è dalla costruzione di una' funzione' fuori dal lambda. – dlf