2017-12-26 9 views
3

Sagen, ich habe:Ergänzen optionale Referenzen in C++ die Lebensdauer von Objekten?

#include <iostream> 
#include "boost/optional.hpp" 
struct cat 
{ 
    int paw = 4; 
}; 

int main() 
{ 
    boost::optional<cat&> z; 
    { 
     cat realCat = cat(); 
     z = realCat; 
    } 
    std::cout << z->paw << std::endl; 
    return 0; 
} 

In den oben genannten gibt keinen Grund, ein konsistentes Ergebnis zu bedruckenden, rechts, wie die realCat freigegeben wurde von } zu erwarten? Oder bewahrt die optional das Leben der realCat?

+2

Sie können die Lebenserweiterung nicht zweimal verstehen. In Ihrem Code verlängert selbst die normale Konstante const oder rvalue die Lebensdauer nicht. – Slava

+1

Eine dieser Fragen, die mich ein wenig zusammenzucken lassen, aber ich stimme immer noch, weil es eine gute Frage ist, die gut gestellt wurde, und tatsächlich ist es ein Problem, das ich mir selbst mit dem Fuß zuvor geschossen habe. Ich habe immer noch eine TODO in einer Code-Basis, um eine Schnittstelle zu refactorisieren, die nicht mehr mit 'optional ' optimiert wird, weil es in Allzweck-Code einfach zu gefährlich ist. – sehe

Antwort

5

Nein, Ihr Code hat ein undefiniertes Verhalten, wenn Sie versuchen, den Wert paw zu drucken.

Die C++ Regeln für die Laufzeitverlängerung nur dann Anwendung, wenn ein temporäres Objekt rvalue Referenz oder lvalue Bezug auf const gebunden ist, aber realCat ist kein vorübergehendes und es zu einer optional Referenzbindung erstreckt sich nicht es Lebensdauer ist.

In jedem Fall gelten diese Regeln für die Lebensdauerverlängerung nicht für boost::optional<T&>. Die documentation für boost::optional erwähnt dies:

Rvalue Referenzen und lvalue Verweise auf const die Fähigkeit, in C++ haben die Lebensdauer einer temporären sie zu binden, zu verlängern. Optional Referenzen haben diese Fähigkeit nicht ...

Was std::optional, Ihr Programm schlecht gebildet werden würde, wenn Sie std::optional<T&> zu schaffen versucht.

[optional.syn]/1

Ein Programm, das die Instanziierung Vorlage optional für einen Referenztyp oder für gegebenenfalls cv qualifizierte Typen in_­place_­t oder nullopt_­t ist schlecht gebildet erforderlich macht.

+0

Ah, so macht 1Z diese Fehler eher unwahrscheinlich. – Carbon

Verwandte Themen