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 ++都编译代码(发出警告),但我想了解为什么他们为成员0
和a1.v
打印a2.v
?请参阅demo。
答案 0 :(得分:12)
他们打印0
并不重要。
对于a1
,初始化的结构不正确。对于a2
,您绑定了对临时的引用,因此您最终会获得悬空引用。对0
没有任何意义 - 它就是参考在那一点上指向的垃圾记忆。一旦违反前提条件,程序就是未定义的行为。
未定义未定义的行为。没有理由期望打印的特定行为。例如,gcc 7打印32764而clang 4打印32765.为什么?为什么不。