このコード (C++14 ドラフト標準[conv.lval]の例) が の未定義の動作を呼び出す方法を理解するのに苦労していますg(false)
。constexpr
がプログラムを有効にするのはなぜですか?
また、「アクセスしない」とはどういう意味y.n
ですか?への両方の呼び出しでg()
、データ メンバーを返しているn
のに、最後の行でアクセスしないと表示されているのはなぜですか?
struct S { int n; };
auto f() {
S x { 1 };
constexpr S y { 2 };
return [&](bool b) { return (b ? y : x).n; };
}
auto g = f();
int m = g(false); // undefined behavior due to access of x.n outside its
// lifetime
int n = g(true); // OK, does not access y.n