2016-05-17 24 views
6

Es ist mir nicht klar, ob die Lebensdauer eines temporären Objekt würde durch die Bindung an einen const-Referenz in ein erweitert werden: Ausdruck:Wird die Lebensdauer eines temporären C++ - Objekts in?: Expression erweitert, indem es an eine lokale const-Referenz gebunden wird?

class Foo {...}; 

Foo *someLValue = ...; 

const Foo& = someLValue ? *someLValue : Foo(); 

Ist die Lebensdauer der erstellten temporären durch den Standard-Konstruktor aufrufen Foo() erweitert, indem es an den lokalen const ref gebunden wird, obwohl die Bindung bedingt ist? Oder erzeugt dies eine hängende Referenz, weil der temporäre Wert von Foo() am Ende des Ausdrucks?: Zerstört würde?

Antwort

5

In diesem Code haben der zweite und dritte Operand des Bedingungsoperators unterschiedliche Wertekategorien (lvalue und prvalue).

Das bedeutet, dass das Ergebnis des Bedingungsoperators ein Prvalue vom Typ Foo ist, der ein temporäres Objekt angibt, das aus dem ausgewählten Operanden initialisiert wird.

Die Referenz bindet direkt an dieses temporäre Objekt und verlängert so die Lebensdauer des temporären Objekts.

Hinweise:

  • Die Referenz nie direkt an *someLValue bindet, nicht einmal zu Foo().
  • Das Temporär, das von Foo() initialisiert wird, ist ein Kopie Elision-Kontext, so dass Sie in diesem Fall das temporäre möglicherweise nicht beobachten können.
  • Das temporäre ist nicht const, obwohl der Verweis auf const ist.