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


请参阅此示例 [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 ++都编译代码(发出警告),但我想了解它们为什么打印 0 对于会员 a1.v 和 a2.v?看到 演示


9092
2017-11-17 19:22


起源

严格相关(几乎重复): stackoverflow.com/questions/21481481/... - edmz


答案:


它们打印并不重要 0

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

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


12
2017-11-17 19:27



@Barry我想,你应该对未定义和不良行为更加准确。当我们谈论新标准时,a1和a2显然都是格式错误,请查看DR 1696。 - overseas
@Barry [class.temporary] / 5(5.1)曾经是: A temporary bound to a reference member in a constructor’s ctor-initializer (12.6.2) persists until the constructor exits,在C ++中14。但这个要点不再存在了 [class.temporary] / 6。 - João Afonso
@overseas我不明白你的评论。 a1 正如我所说的那样,形成不良 a2 并不是一成不变的。这个问题使用了缺陷报告中的示例,该报告本身就表明了这一点 a2 并不是一成不变的。 - Barry
@Barry我终于同意你说的话了。但是我还有一点需要理解:初始化 a1 和 a2,为什么它是不正确的 a1 并且形式良好 a2? - João Afonso
@JoãoAfonso你在问题中引用了为什么它的形象不合理 a1。没有任何不良形式 a2  - 你绑定了对左值的引用。这是允许的。 - Barry