Perché chiamare std :: move su un oggetto const
chiama il costruttore di copie quando viene passato a un altro oggetto? In particolare, il codicePerché chiamare std :: move su un oggetto const chiama il costruttore di copie quando viene passato a un altro oggetto?
#include <iostream>
struct Foo {
Foo() = default;
Foo(Foo && x) { std::cout << "Move" << std::endl; }
Foo(Foo const & x) = delete;
};
int main() {
Foo const x; Foo y(std::move(x));
}
fallisce la compilazione con il messaggio:
g++ -std=c++14 test07.cpp -o test07
test07.cpp: In function 'int main()':
test07.cpp:10:36: error: use of deleted function 'Foo::Foo(const Foo&)'
Foo const x; Foo y(std::move(x));
^
test07.cpp:6:5: note: declared here
Foo(Foo const & x) = delete;
^
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1
Certo, mi aspetto che a fallire perché non possiamo spostare un valore const
. Allo stesso tempo, non capisco il percorso che il codice impiega prima di provare a chiamare il costruttore di copie. Significato, so che std::move
converte l'elemento in un valore x, ma non so come procedono le cose dopo rispetto a const
.
Il 'const'ness del spostato l'oggetto non è cambiato, 'Foo const &&' non può legarsi a' Foo &&' così il compilatore prova ad accedere al costruttore di copie, che fallisce perché viene cancellato. – user657267
Non sono esperto degli operatori di spostamento, ma forse è possibile chiamare lo spostamento su un valore 'const', ma il risultato da esso può essere accettato solo nel costruttore di copie, quindi il compilatore decide di chiamarlo. – BWG
"Significato, so che std :: move converte l'elemento in un valore x" In realtà, non lo è. Restituisce un riferimento di rvalue all'articolo. –