2016-05-18 19 views
1

Stack Overflowの質問Does a const reference prolong the life of a temporary?で、一時参照オブジェクトの寿命を延ばす方法を理解しています。C++の右辺参照は一時オブジェクトの寿命を延ばします

私は、一時的なオブジェクトの寿命も延ばすことができることを知っていますが、いくつかの違いがあるかどうかはわかりません。

もしそうなら、このようなIコード:

#include <string> 
#include <iostream> 
using namespace std; 

class Sandbox 
{ 
public: 
    Sandbox(string&& n) : member(n) {} 
    const string& member; 
}; 

int main() 
{ 
    Sandbox sandbox(string("four")); 
    cout << "The answer is: " << sandbox.member << endl; 
    return 0; 
} 

が、それは動作しますか、それは上記のリンクのように同じエラーを持っているのだろうか?

次のようなコードを作成するとどうなりますか?

class Sandbox 
{ 
public: 
    Sandbox(string&& n) : member(move(n)) {} 
    const string&& member; 
}; 

正常に動作しますか?

+2

一時的な存続期間は、それに直接バインドする参照の有効期間と一致します。これは 'n'(メンバーではありません)です。 –

+0

@ M.M' string && member'は意味がありますか? – songyuanyao

+0

@ M.M私は、メンバーの値の参照を変更してOPコードを有効にすることを意味しましたか?一時的な文字列( "four")の寿命は、声明文まで延長されていますか? – songyuanyao

答えて

1

string("four")コンストラクタ呼び出しの間、一時的に存在します(これはリンクされた質問の答えで説明されています)。オブジェクトが構築されると、この一時的なものは破壊されます。クラス内の参照は、破壊されたオブジェクトへの参照になりました。参照を使用すると、未定義の動作が発生します。

ここでは、値の参照の使用は違いはありません。

+0

'sandbox(string && n):member(std :: move(n)){} const string && member;' – Yves

+1

@Thomasは違いはありません –

関連する問題