2016-05-31 18 views
3

Ich bin auf der Suche nach oben lifetime of a temporary auf cppreference.com und ich fand etwas geändert von C++ 14:Lebensdauer eines temporären Objekt gebunden an ein Referenzelement in Elementinitialisierung Liste (C++ 14)

Jedes Mal, wenn ein Verweis auf einen vorübergehendes oder zu einer Basis subobject von einer temporären, die Lebensdauer der temporären gebunden ist, verlängert die Lebensdauer der Referenz anzupassen, mit folgenden Ausnahmen:

...

eine temporäre Bindung an eine Referenz Das Element in einer Konstruktorinitialisierungsliste bleibt nur so lange bestehen, bis der Konstruktor beendet wird, und nicht so lange, wie das Objekt existiert. (Anmerkung: solche Initialisierung ist schlecht ausgebildet, wie von DR 1696) (bis C++ 14)

Ich habe den Standard gibt es wirklich keine solche Aussage. ($ 12.2/5 Temporäre Objekte [class.temporary])

Bedeutet es ab C++ 14, dass die Lebensdauer einer temporären Bindung an ein Referenzelement auf die Lebensdauer des Objekts erweitert wird?

Ich habe versucht, den folgenden Code mit GCC und CLANG scheinen beide nicht, das temporäre wird zerstört, wenn der Konstruktor endet.

#include <iostream> 

struct X { 
    ~X() { std::cout << "X dtor\n"; } 
}; 
struct Y { 
    Y() : x_(X()) { std::cout << "Y ctor\n"; } 
    const X& x_; 
    ~Y() { std::cout << "Y dtor\n"; } 
}; 
int main() 
{ 
    Y y; 
    std::cout << "Hello, world!\n"; 
} 

Ergebnis:

Y ctor 
X dtor 
Hello, world! 
Y dtor 

Habe ich es falsch verstanden?

+4

Haben Sie den [Fehlerbericht] (http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1696) gelesen? – NathanOliver

+1

** JA ** (Sie haben es falsch verstanden) – Walter

Antwort

5

Der Defekt Bericht, den Sie zitiert wurde verabschiedet, und N4582 enthält bereits die neue Formulierung in [class.base.init]:

Eine vorübergehende Expression gebunden an ein Referenzelement in einem mem-initializer ist schlecht ausgebildet. [Beispiel:

struct A { 
    A() : v(42) { } // error 
    const int& v; 
}; 

- Ende Beispiel]

So ist es nicht für die Lebensdauer des Objekts erweitert - der Code einfach schlecht ausgebildet ist. gcc und clang geben Warnungen auf Ihrem Code auf jeder Version aus, die ich ausprobiert habe, was meiner Meinung nach konform ist, aber im Idealfall sollten sie dort Fehler haben.

+0

Nur die Ausgabe einer Warnung ist nicht konform; Wenn nicht anders angegeben, wenn etwas "schlecht geformt" ist, dann muss der Compiler eine Diagonale ausgeben. Aber C++ 17 ist noch nicht fertig. –

+5

@NicolBolas Eine Warnung ist eine Diagnose. Solange ein Fehler oder eine Warnung vorliegt serviert, dann ist es konform. – NathanOliver

+0

@NathanOliver die Implementierung definiert, ob eine Warnung eine Diagnose ist oder nicht. Haben Sie Links zu der Dokumentation von clang bzw. gcc, die unterstützen, was Sie sagten? –