为什么clang和g ++在C ++ 1z中的a1.v和a2.v中打印0?

时间:2016-11-17 19:22:28

标签: c++ c++17

请参阅[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 ++都编译代码(发出警告),但我想了解为什么他们为成员0a1.v打印a2.v?请参阅demo

1 个答案:

答案 0 :(得分:12)

他们打印0并不重要。

对于a1,初始化的结构不正确。对于a2,您绑定了对临时的引用,因此您最终会获得悬空引用。对0没有任何意义 - 它就是参考在那一点上指向的垃圾记忆。一旦违反前提条件,程序就是未定义的行为。

未定义未定义的行为。没有理由期望打印的特定行为。例如,gcc 7打印32764而clang 4打印32765.为什么?为什么不。