2017-12-26 34 views
3

は私が持っていると言う:realCat}でリリースされたとして、上記でC++のオプションの参照は、オブジェクトの寿命を保持しますか?

#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; 
} 

、印刷するための一貫性のある結果を期待する理由は、右、ありませんか?または、optionalrealCatの寿命を保存しますか?

+2

あなたはライフエクステンションを2回も理解していません。あなたのコードでは、通常のconstまたはrvalue参照でさえ寿命が延びません。 – Slava

+1

私は少し気が狂っているが、私はまだそれがよい質問であり、実際には私が以前に足で自分自身を撃った問題であるので、私はまだupvote質問の一つ。私はまだコードベースでTODOを持っています。インタフェースをリファクタリングするために、 'optional 'を使ってもはや最適化されなくなりました。なぜなら汎用コードではあまりにも危険だからです。 – sehe

答えて

5

pawの値を印刷しようとすると、コードに未定義の動作がありません。 一時的オブジェクトがconstへの右辺値参照または左辺値参照にバインドされたときに寿命延長のため

C++の規則は適用されますが、realCatは一時的なものではなく、optional参照にそれを結合すると、それは一生だ拡張されません。

いずれの場合でも、これらの生涯延長規則はboost::optional<T&>には適用されません。 constへ

右辺値参照と左辺値参照はそれらが結合し、一時の寿命を延ばすために、C++での能力を持っている:boost::optionalためdocumentationは、この言及します。あなたがstd::optional<T&>を作成しようとした場合オプションの参照は、この機能 ... std::optionalについては

、あなたのプログラムが病気に形成されるだろうがありません。

[optional.syn]/1

レファレンスタイプのテンプレートoptionalのインスタンス化を必要とする、またはおそらくはCV修飾タイプのin_­place_­tまたはnullopt_­tが病気に形成されているプログラム。

+0

ああ、1Zはこれらの間違いをより起こりにくくします。 – Carbon

関連する問題