4

範囲外になると参照値が失われる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
}
4

1 に答える 1

8

ここにぶら下がっている参照がないと思う理由は何ですか? がある。特にダングリング参照を生成するため、プログラムの動作は未定義です。残りは、未定義の動作の特定の兆候にすぎません。参照がぶら下がっているからといって、明示的に「壊れた」方法で動作するという意味ではありません。

あなたの場合、参照はおそらくボンネットの下でポインターとして実装されます。そのポインターは、元々 value が含まれていた一時的なメモリ位置を指すように作成されました5。その後、メモリは「公式に」リリースされ、リファレンスは「公式に」ぶら下がりました。しかし、ポインタはまだ古い値を保持しており、それが指していたメモリはまだ の値を保持しています5。そのため、誰かがその一時メモリを上書きするか、誰かがポインタを再初期化するまで5、ダングリング参照を通じてその「ゴースト」を見ることができるはずです。それはまさにあなたの実験で見られるものです。もちろん、コード内で意味のある意味で依存することはできません。

于 2013-05-29T00:23:17.947 に答える