重複の可能性:
ローカル変数のメモリにそのスコープ外でアクセスできますか?
C++ コンストラクター: const 参照の初期化中のガベージ
この質問は、私が以前に尋ねた別の質問「PImpl の代わりに不透明な参照。可能ですか?」に直接関連しています。.
コンストラクターで一時変数に初期化される他のクラスの参照メンバーを持つクラスがあるとします。
#include <iostream>
struct B
{
B(int new_x = 10) : x(new_x) { std::cout << "B constructed\n"; }
~B() { std::cout << "B destroyed\n"; }
public:
int x;
};
struct A
{
A()
: b( B(23) )
{
std::cout << "A constructed\n";
}
void Foo()
{
std::cout << "A::Foo()\n";
}
~A()
{
std::cout << "A destroyed\n";
}
public:
const B& b;
};
int main()
{
A a;
a.Foo();
cout << "x = " << a.b.x << endl;
}
上記のコードを実行すると、出力は次のようになります。
B constructed
B destroyed
A constructed
A::Foo()
x = 23
A destroyed
一時が破棄されて参照メンバーが無効になったとしても、参照メンバーの整数フィールドは引き続き読み取り可能です。なぜそれはまだ機能しますか?