1. ホーム
  2. c++

[解決済み] const参照クラスのメンバはテンポラリーを長持ちさせるか?

2022-04-15 17:09:08

質問

なぜ、このような

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

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

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

の出力を与える。

<ブロッククオート

という答えが返ってきます。

の代わりに。

答えは、「4」です。

解決方法は?

唯一 ローカル const を参照することで、寿命が延びます。

標準では、参照宣言の初期化子に関するセクションである §8.5.3/5, [dcl.init.ref] でそのような動作が規定されています。あなたの例での参照は、コンストラクタの引数 n というオブジェクトが存在する場合、無効となります。 n にバインドされているものがスコープ外に出てしまう。

寿命延長は関数引数を介しての推移的なものではありません。§12.2/5 [class.temporary]を参照してください。

2つ目のコンテキストは、参照がテンポラリにバインドされている場合です。参照が束縛されているテンポラリ、またはテンポラリが束縛されているサブオブジェクトの完全なオブジェクトであるテンポラリは、以下に指定する場合を除き、参照の寿命まで永続する。コンストラクタのCTOR-INITIALIZER (§12.6.2 [class.base.init]) の中で参照メンバに束縛された一時は,コンストラクタが終了するまで持続する。関数呼び出し (§5.2.2 [expr.call]) における参照パラメータへの一時的なバインドは、呼び出しを含む完全な式が完了するまで持続する。