C++ 为什么叮当声和g++;在本例中,用C+打印a1.v和a2.v的0+;1z?

C++ 为什么叮当声和g++;在本例中,用C+打印a1.v和a2.v的0+;1z?,c++,c++17,C++,C++17,请参见中的示例 clang和g++都编译代码(带有警告的clang),但我想了解他们为什么为成员a1.v和a2.v打印0?请参阅。它们是否打印0并不重要 对于a1,初始化一开始格式不正确。对于a2,您将一个引用绑定到一个临时引用,因此最终得到一个悬空引用。对于0,它没有任何意义——它是引用在该点指向的任何垃圾内存。一旦你违反了前提条件,程序就是未定义的行为 未定义的行为是未定义的。没有理由期待打印的特定行为。例如,gcc 7打印32764,而clang 4打印32765。为什么?为什么不呢 @B

请参见中的示例


clang和g++都编译代码(带有警告的clang),但我想了解他们为什么为成员
a1.v
a2.v
打印
0
?请参阅。

它们是否打印
0
并不重要

对于
a1
,初始化一开始格式不正确。对于
a2
,您将一个引用绑定到一个临时引用,因此最终得到一个悬空引用。对于
0
,它没有任何意义——它是引用在该点指向的任何垃圾内存。一旦你违反了前提条件,程序就是未定义的行为


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

@Barry我认为,你应该更准确地描述未定义和不规范的行为。当我们谈论新标准时,a1和a2显然都是格式不正确的,请检查DR 1696。@Barry[class.temporary]/5(5.1)过去是:
在C++14中,构造函数的ctor初始值设定项(12.6.2)中临时绑定到引用成员,直到构造函数退出为止。但是这个要点在国外已经不存在了,我不理解你的评论
a1
格式不正确,正如我所说,
a2
格式不正确。这个问题使用了缺陷报告中的例子,它本身表明
a2
不是格式错误的。@Barry我终于同意你所说的。但是还有一点我想理解:
a1
a2
的初始化,为什么
a1
的格式不正确,
a2
的格式正确?@JoãoAfonso你在问题中提到了为什么
a1
的格式不正确。关于
a2
,没有什么格式不正确的地方-您正在将引用绑定到左值。这是允许的。严格相关(几乎重复):
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