请参阅 [class.base.init]/11 中的示例
struct A {
A() = default; // OK
A(int v) : v(v) { } // OK
const int& v = 42; // OK
};
A a1; // error: ill-formed binding of temporary to reference
A a2(1); // OK, unfortunately
clang 和 g++ 都编译代码(clang 带有警告),但我想了解为什么它们为成员 a1.v
打印 0
和a2.v
?参见 demo .
最佳答案
他们打印 0
并不重要。
对于 a1
,初始化的格式不正确。对于 a2
,您将引用绑定(bind)到一个临时引用,因此您最终得到一个悬空引用。 0
没有任何意义 - 它是引用恰好指向该点的垃圾内存。一旦你违反了先决条件,程序就是未定义的行为。
未定义的行为是未定义的。没有理由期望打印有特定的行为。例如,gcc 7 打印 32764 而 clang 4 打印 32765。为什么?为什么不。
关于c++ - 为什么在 C++1z 的这个例子中,clang 和 g++ 为 a1.v 和 a2.v 打印 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40663320/