2017-03-17 17 views
0

この場合、どうなりますか?'const auto&'に値を代入するとどうなります

// assume WeakPtr is valid and has not expired 
const auto& something = WeakPtr.lock(); 
something->doStuff(); 

これは未定義ですか?

このシナリオでは変更されますか?

std::shared_ptr<Something> getSomething() { return mSomething.lock(); } 
const auto& something = getSomething(); 

これはどうですか?これらのケースのそれぞれにおいて

std::vector<int> getInts() { return std::vector<int>{ 1, 2, 3 }; } 
const auto& ints = getInts(); 

const auto&は、私はオブジェクトへの参照をバインドすることを意味しますが、これらの例それぞれに私は一時的な右辺値オブジェクトにバインドしています。私は災害を招いていますか?

+0

ニートどのようにこのような質問をたくさんアップ:http://stackoverflow.com/questions/42868517/why-can-you-intialize-a-const-reference-but-not-a-non-const-reference -from-an-rv何かと便利な解説。 – user4581301

+0

「一時的」と「rvalue」の違いに注意することが重要です。後者は厳密に一般的です。たとえば、 'const int&r = 5;'と 'const int&q = std :: move(5);'を比較します。両方とも価値観であり、1つは災害です。 –

答えて

1

これは定義されていませんか?

それぞれの場合が明確に定義されています。

この場合、どうなりますか?

それぞれの場合、一時オブジェクトの有効期間は、標準の[class.temporary]セクションで説明されているように、const参照の有効期間と一致するように延長されます。

[class.temporary(規格案)

4一時がフル 式の終わりとは異なる点で破壊された二つのコンテキストがあります。最初のコンテキストは... [あなたの場合とは無関係]

5第2のコンテキストは、参照が一時的なものにバインドされている場合です。参照が にバインドされている一時的なもの、または参照がバインドされているサブオブジェクトの完全なオブジェクトである一時的なものは、参照の存続期間中は、 の間存続します... [あなたのケースには適用されないいくつかの例外]

+0

_ "それぞれのケースはよく定義されています" _うーん、それは 'WeakPtr.lock()'と 'mSomething.lock()'が何を返すかによって異なります。最終的なケースは、唯一確かに明確に定義されたケースです。 –

+0

基本的には、ローカルへの参照が返されていないことがよく定義されています。基本的に。 –

+0

@BoundaryImpositionこの場合、関数が一時的なオブジェクト(rvalue)を返すときに、その定義に問題がありますか? (ローカル、または他のものへの)参照は左辺値です。 – user2079303

関連する問題