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