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

Joã*_*nso 11 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
Run Code Online (Sandbox Code Playgroud)

无论铛和g ++编译代码(铛一个警告),但我想明白为什么他们打印0的成员a1.va2.v?见演示.

Bar*_*rry 12

它们打印并不重要0.

因为a1,初始化是错误的开始.因为a2,你绑定了一个临时引用,所以你最终得到一个悬空引用.没有任何意义0- 它就是参考在那一点指向的垃圾记忆.一旦违反前提条件,程序就是未定义的行为.

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