Vous ne pouvez pas faire cela. Les références doivent être liées à quelque chose, cela peut ne pas vous plaire mais cela évite toute une catégorie d'erreurs, car si vous avez une référence, vous pouvez toujours supposer qu'elle est liée à quelque chose, contrairement à un pointeur qui peut être nul.
Votre exemple de code ne fonctionnerait pas de toute façon parce que vous tentez de lier une référence non-constante à un objet temporaire, ce qui n'est pas valide.
Pourquoi faut-il que ce soit une référence de toute façon ? Une solution serait de s'assurer que votre type a un constructeur par défaut peu coûteux et qu'il peut être déplacé efficacement, puis de faire simplement :
MyObject obj;
if([condition])
obj = MyObject([something])
else
obj = MyObject([something else]);
Sinon, il faudrait mettre le code conditionnel dans une ou plusieurs fonctions :
const MyObject& ref = createObject([condition]);
ou
const MyObject& ref = [condition] ? doSomething() : doSomethingElse();
Notez que ces deux versions utilisent un const référence, qui peut se lier à un temporaire, si l'objet doit être non-const, alors encore une fois arrêtez d'essayer d'utiliser une référence :
MyObject obj = createObject([condition]);
Cela sera probablement tout aussi efficace que ce que vous essayiez de faire, grâce à la fonction optimisation de la valeur de retour