なぜこうなるのでしょうか:
#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です
ベストアンサー1
のみ地元 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]) 内の参照パラメータにバインドされている一時オブジェクトは、呼び出しを含む完全な式が完了するまで存続します。