Per rifiutare il primo snippet di codice, il compilatore applica la regola semplice che non è possibile associare direttamente un riferimento temporaneo a un riferimento non const.
Per rifiutare il secondo, il compilatore potrebbe forse applicare una regola che l'istruzione return
di una funzione che restituisce per riferimento non può essere il nome di una variabile automatica (incluso un parametro di funzione di valore per byte). Anche a me sembra una regola abbastanza facile.
Non so perché lo standard non specifica che farlo è mal formato. Non riesco a pensare a un uso valido per questo, ma forse al momento del primo standard avrebbe creato un onere eccessivo su qualche implementazione o altro. O forse si è ritenuto che fosse solo una mezza correzione e non ne valesse la pena (ci sono molti altri modi per creare un riferimento ciondolante, questo blocca solo uno di essi).
Il motivo per cui lo standard in genere non impedisce di creare un riferimento non const associato a un temporaneo è che ci sono occasioni in cui è OK. Ad esempio:
struct Foo {
static void set(Foo &f) { f.val = 0; }
int val;
int bar() {
set(*this);
return val;
}
};
std::cout << Foo().bar() << "\n";
Qui Foo()
è un temporaneo, e la linea set(*this)
si lega ad un riferimento non const (ma non direttamente, esso utilizza un'espressione lvalue *this
che si riferisce ad una temporanea alcune volte, ma non altre) . Non c'è nessun problema qui, il temporaneo sopravvive al riferimento. Quindi sarebbe inutilmente restrittivo che il linguaggio impedisca in qualche modo a qualsiasi temporaneo di essere associato a qualsiasi riferimento non const.
fonte
2012-03-06 15:53:46
Questo è UB (beh, accedendo al riferimento, comunque) e qualsiasi compilatore sensato ti avviserà a riguardo. –