C++ 这似乎是叮当声中的一个bug++;编译程序

C++ 这似乎是叮当声中的一个bug++;编译程序,c++,c++11,reference,clang++,C++,C++11,Reference,Clang++,以下代码正常执行(请参阅): 正如所料。但是,如果我注释掉main()中的前两条语句,只留下 std::cout << rri << '\n'; std::cout未定义的行为:ri和rri都是初始化的,指的是临时的一个成员,该成员立即被销毁 悬空引用指向可能被另一个对象重用的内存位,在这种情况下,您可能会看到来自该对象的数据。或者您可能会看到其他类型的未定义行为。经验法则:错误不在编译器中,而是在您对语言的理解中。该程序未定义。@CouchDeveloper是的,这就

以下代码正常执行(请参阅):

正如所料。但是,如果我注释掉main()中的前两条语句,只留下

std::cout << rri << '\n';

std::cout未定义的行为:
ri
rri
都是初始化的,指的是临时的一个成员,该成员立即被销毁


悬空引用指向可能被另一个对象重用的内存位,在这种情况下,您可能会看到来自该对象的数据。或者您可能会看到其他类型的未定义行为。

经验法则:错误不在编译器中,而是在您对语言的理解中。该程序未定义。@CouchDeveloper是的,这就是我的意思。我会编辑注释。-1:这不是编译器中的错误。当您使用广泛使用的编译器(如MS、gcc、clang等)时,我建议您始终认为问题出在您的代码中,而不是编译器中。编译器错误极其罕见(特别是对于稳定版本),这里的问题很可能是99.99%,这表明“编译器错误”似乎是代码中的错误。@CouchDeveloper仍然是一样的。只有直接使用临时文件初始化引用时,临时文件的生命周期才会延长。在这里,它是用
运算符int&(
的结果初始化的,因此临时值在表达式末尾被销毁。@WakeupBrazil:两者都立即销毁。@WakeupBrazil
int&ri=A()
实际上是说
int&ri=(int&)A()。实际上,这是对临时副本的引用。它不是绑定到从
A()
生成的对象,而是对
i
的内部引用。由于
A()
的结果没有绑定到任何东西,因此它被销毁,因此,
i
也随之销毁。@WakeupBrazil:转换不一定会引用临时对象的成员,因此行为也不一定是未定义的(尽管在您给出的示例中)@WakeupBrazil在他们在标准文档中给出的示例中,它没有指定
操作符int&
正在做什么。该部分的全部目的是向您展示如何初始化引用(而不是讨论其生存期)。虽然您的代码看起来很相似,但问题在于细节。例如,如果
inti
改为
static inti
,则它不再是UB。
1
1
std::cout << rri << '\n';