Considerate questo codiceCosa si può dire del valore dei membri di tipo fondamentale spostati da un oggetto durante la costruzione del movimento?
Foo f1;
Foo f2{ std::move(f1) };
mi aspetterei i valori dei membri di f1
per contenere non più necessariamente i valori indicati dal costruttore di default. Tuttavia, il test con più compilatori che utilizzano questa implementazione di Foo
suggerisce diversamente.
class Foo
{
public:
Foo() = default;
Foo(Foo &&) = default;
std::string s{ "foo" };
bool t{ true };
bool f{ false };
};
Dopo lo spostamento f1.t
è sempre true
e f1.f
è sempre false
. Come descritto in this question, mi aspetto che i valori siano non deterministici o che entrambi i valori booleani abbiano lo stesso valore. Tuttavia, sembrano ottenere lo stesso valore che otterrebbero dal costruttore predefinito.
E 'solo una dettagli di implementazione dei miei compilatori (per coincidenza lo stesso) o è presente nella norma?
"Mi aspetto che i valori dei membri di f1 non siano inizializzati ora" Non è possibile inizializzare l'inizializzazione di qualcosa che è già stato inizializzato. – juanchopanza
Puoi spostare qualcosa non inizializzato al suo posto: http://cpp.sh/5yxdt – Mathias
No, sarebbe un comportamento indefinito (lettura da variabili non inizializzate). Ma il tuo esempio non lo mostra. – juanchopanza