Non è possibile farlo. I riferimenti devono essere legati a qualcosa, potrebbe non piacerti ma impedisce un'intera classe di errori, perché se hai un riferimento puoi sempre presumere che sia legato a qualcosa, a differenza di un puntatore che potrebbe essere nullo.
Il codice di esempio non funzionerebbe comunque perché si tenta di associare un riferimento non const a un oggetto temporaneo, che non è valido.
Perché è necessario che sia comunque un riferimento? Una soluzione potrebbe essere quella di assicurare il vostro tipo ha un costruttore di default poco costoso e può essere spostato in modo efficiente, quindi basta fare:
MyObject obj;
if([condition])
obj = MyObject([something])
else
obj = MyObject([something else]);
In caso contrario si avrebbe dovuto mettere il codice condizionale in una o più funzioni, sia:
const MyObject& ref = createObject([condition]);
o
const MyObject& ref = [condition] ? doSomething() : doSomethingElse();
Si noti che entrambe queste versioni utilizzano un const di riferimento , che può legarsi ad un temporanea, se il oggetto deve essere non-const, poi di nuovo smettere di cercare di utilizzare un riferimento:
MyObject obj = createObject([condition]);
questo sarà probabilmente essere altrettanto efficace come quello che si stava tentando di fare, grazie alla return value optimization
fonte
2013-02-14 20:30:24
Un'inizializzazione da temporanea? Ciò non funzionerà anche senza la condizione: 'MyObject & ref = MyObject ([qualcosa]);', perché non è possibile associare un riferimento temporaneo a un valore non costante. – GManNickG
@GManNickG: questo vale anche per le risposte Zaffy e suszterpatt? – qPCR4vir
@ qPCR4vir: sì. La domanda rimane, in un certo senso, non direttamente. – GManNickG