这似乎是 clang++ 编译器中的一个错误

This seems to be a bug in the clang++ compiler

本文关键字:一个 错误 似乎是 clang++ 编译器      更新时间:2023-10-16

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

#include <iostream>
struct A {
int i;
A():i(1){}
operator int&() { return i; }
};
int& rri = A();
int main()
{
int& ri = A();
std::cout << ri << 'n';
std::cout << rri << 'n';
}

它打印

1
1

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

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

代码打印0.

编辑:

假设问题出在我的代码上。但随后我问:我在下面复制的标准中 8.5.3/5 中的第三个要点的目的是什么:

对类型"cv1 T1"的引用由类型的表达式初始化 "cv2 T2"如下:

  • 如果引用是左值引用和初始值设定项表达式

    • 是一个左值(但不是位字段),并且"cv1 T1"与"cv2 T2"的引用兼容,或者

    • 具有类类型
    • (即 T2 是类类型),其中 T1 与 T2 无关,可以转换为类型的左值 "cv3 T3",其中"cv1 T1"与"cv3 T3"引用兼容(此转换是通过枚举适用的转换函数 (13.3.1.6) 并选择最佳转换来选择的 过载分辨率 (13.3)),

    则引用绑定到 初始值设定项表达式左值在第一种情况下和左值 在第二种情况下的转换结果(或者,在任一情况下,转换为 对象的相应基类子对象)。[ 注:通常 左值到右值 (4.1)、数组到指针 (4.2) 和 不需要函数到指针 (4.3) 标准转换,并且 因此,当这种与左值的直接绑定 做。—尾注 ]

未定义的行为:rirri都被初始化为引用临时成员,该成员立即被销毁。

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

相关文章: