我很难理解这段代码(来自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
constexpr
在编译时被计算并存储在程序的某个只读部分,与堆栈帧无关,而x
则在堆栈帧中,访问已删除堆栈帧后的x
会导致未定义行为。 - R Sahu