Credo che l'espressione T()
crei un valore rvalue (secondo lo standard). Tuttavia, il seguente codice compila (almeno gcc4.0):Perché è consentito T() = T()?
class T {};
int main()
{
T() = T();
}
so tecnicamente questo è possibile perché funzioni membro possono essere richiamate sul provvisori ed Quanto sopra è solo richiamando l'operatore = sul rvalue temporanea creata dal primo T()
.
Ma concettualmente è come assegnare un nuovo valore a un valore. C'è una buona ragione per cui questo è permesso?
Modifica: Il motivo per cui trovo questo strano è che è severamente vietato sui tipi predefiniti, ma è consentito sui tipi definiti dall'utente. Ad esempio, int(2) = int(3)
non verrà compilato poiché si tratta di un "valore lvalue non valido nell'assegnazione".
Quindi immagino che la vera domanda sia, è stato questo comportamento un po 'incoerente incorporato nella lingua per un motivo? O è lì per qualche motivo storico? (Ad esempio, sarebbe concettualmente più sano consentire solo alle funzioni membro const di essere invocato su espressioni rvalue, ma ciò non può essere fatto perché ciò potrebbe rompere qualche codice esistente.)
Questo insieme alla risposta di FredOverflow risponde completamente alla mia domanda. Grazie! – Rimo