範囲外になると参照値が失われるbar
と予想されますが、印刷すると、割り当てられた初期値が正しく表示されます。var
どうしてこれなの?
#include <iostream>
struct S
{
int const& var;
S(int const& bar = 5) : var(bar)
{}
};
int main()
{
S s;
std::cout << s.var; // 5
}
ここにぶら下がっている参照がないと思う理由は何ですか? がある。特にダングリング参照を生成するため、プログラムの動作は未定義です。残りは、未定義の動作の特定の兆候にすぎません。参照がぶら下がっているからといって、明示的に「壊れた」方法で動作するという意味ではありません。
あなたの場合、参照はおそらくボンネットの下でポインターとして実装されます。そのポインターは、元々 value が含まれていた一時的なメモリ位置を指すように作成されました5
。その後、メモリは「公式に」リリースされ、リファレンスは「公式に」ぶら下がりました。しかし、ポインタはまだ古い値を保持しており、それが指していたメモリはまだ の値を保持しています5
。そのため、誰かがその一時メモリを上書きするか、誰かがポインタを再初期化するまで5
、ダングリング参照を通じてその「ゴースト」を見ることができるはずです。それはまさにあなたの実験で見られるものです。もちろん、コード内で意味のある意味で依存することはできません。