2017-06-09 4 views
3

Ist die folgende Verwendung von innerhalb main sicher? Ich glaube, die Bindung von mk_pair hat seine Lebensdauer auf die von verlängert, aber wie wäre es mit den temporären Objekten von Wrap{1} und Wrap{2} erstellt?Lebensdauer eines temporären mit temporären Teilausdrücken, gebunden an eine Referenz

struct Wrap { int &&x; }; 

struct Pair { Wrap &&w1, &&w2; }; 

Pair mk_pair(Wrap &&w1, Wrap &&w2) { return Pair{std::move(w1),std::move(w2)}; } 

int main(int argc, char *argv[]) 
{ 
    Pair &&p = mk_pair(Wrap{1},Wrap{2}); 
    std::cout << p.w1.x << ' ' << p.w2.x << '\n'; 
    return 0; 
} 

Antwort

4

No. Wrap{1} und Wrap{2} sind nicht auf automatische Referenzen in main gebunden, so dass sie am Ende der Leitung zerstört.

Die Pair, die von mk_pair zurückgegeben wird, hat ihre Lebensdauer auf die von erweitert, aber ihre Referenzen sind baumeln.

2

Dies ist ein undefiniertes Verhalten. In

mk_pair(Wrap &&w1, Wrap &&w2) 

nehmen Sie w1 und w2 als rvalue Referenzen, die in Ordnung ist, verlängern Sie das Leben in die Funktion. Dann geben Sie ein Objekt zurück, das auf diese Referenzen verweist. Das Problem damit ist, wenn der Ausdruck endet, die Provisorien, die Sie als Referenz übergeben haben, werden zerstört. Das bedeutet, dass Sie wissen, dass Referenzen auf abgelaufene Objekte verweisen und diese nicht definiert sind.

Verwandte Themen