La categoria di valore dell'espressione di chiamata di funzione è in effetti un valore.
In effetti, non è possibile chiamare l'operatore di assegnazione copia su primitive di valore. La definizione storica di rvalues in C era in realtà la distinzione che essi non possono essere sul lato sinistro di un asserzione.
Gli operatori di assegnazione delle classi sono leggermente diversi. Sono funzioni membro regolari. E nessuna regola impedisce di chiamare funzioni membro di rvalue. In effetti, è spesso abbastanza utile quando le funzioni hanno effetti collaterali.
Come funziona, beh, l'operatore di assegnazione copia viene chiamato sul temporaneo, l'operatore copia l'argomento della mano destra, modificando lo stato del temporaneo. Dopo l'istruzione, l'oggetto temporaneo viene scartato. Non c'è UB, solo una copia inutile.
È possibile evitare di chiamare l'assegnazione copia su un rvalue, dichiarando l'operatore con un qualificatore di riferimento come questo: Test& operator=(Test) & = default;
. I qualificatori di riferimento sono stati aggiunti solo più tardi in C++ 11, quindi non è stato possibile specificare (implicito) l'assegnazione della copia per essere qualificata per il ref-in prima. Presumibilmente, C++ 11 non ha modificato il qualificatore del costruttore di copie implicite per evitare di rompere il vecchio codice che assegna a un valore rvalore, anche se tale assegnazione sembra abbastanza inutile. Il High Integrity C++ Coding Standard consiglia di utilizzare il qualificatore di riferimento con operatori di assegnazione copia definiti dall'utente.
"_Se una funzione restituisce un rvalue_" E non lo fa. – curiousguy