Non è possibile assegnare un tipo primitivo di rvalue (aka temporaneo) in C++, come (int)7
o un puntatore restituito da un valore di una funzione.Questo ha molto senso, poiché il risultato del compito verrebbe immediatamente scartato, quindi probabilmente non è ciò che voleva il programmatore. rvalue significa 'lato destro del segno =
' da grammatiche linguistiche, o un valore temporaneo (anonimo).
Tuttavia su oggetti di classe, =
invoca appena operator=
. Di solito quando lhs è un valore, questo non avrebbe senso, ma a volte sarebbe (per esempio, la classe è uno pseudo-riferimento dell'oggetto proxy (come quello []
su std::vector<bool>
restituisce). Quindi è trattato nit in tutti i particolari, è solo invoca il metodo. e non c'era modo di sapere se il metodo è stato richiamato da una rvalue temporaneo o un lvalue 'reale'.
riferimenti rvalue sono di nuovo in C++ 11, così come lo sono i metodi qualificati rvalue.
Prima di C++ 11, non c'era modo di bloccare il chiamare operator=
su un oggetto di tipo classe solo perché era un temporaneo
come begin
retu rns un temporaneo non-const, se è di tipo di classe (non garantito dallo standard) a cui può essere assegnato.
Oggi possiamo bloccare l'assegnazione ai provini del tipo di classe, ma la libreria standard non è stata modificata per bloccarla sui suoi tipi. Probabilmente almeno in parte per evitare retrocompatibilità e in parte per determinare le migliori pratiche al di fuori di std
.
Perché questo deve essere espressamente proibito? E cosa ne pensi di quella linea? – Mat
Bene, per quanto ne so se faccio lo stesso con una funzione membro di una classe, il compilatore si lamenta perché deve essere un lvalue modificabile. – Ant