这似乎是 clang++ 编译器中的一个错误
This seems to be a bug in the clang++ compiler
以下代码正常执行(请参阅此处):
#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) 标准转换,并且 因此,当这种与左值的直接绑定 做。—尾注 ]
未定义的行为:ri
和rri
都被初始化为引用临时成员,该成员立即被销毁。
悬空引用指向可能被另一个对象重用的内存位,在这种情况下,您可能会看到来自该对象的数据。或者你可能会看到一些其他类型的未定义的行为。
相关文章:
- 试图修复一个错误,该错误不会让我开始编程其余部分
- MSVC 无法根据模板参数进行数学运算,这是一个错误吗?
- 我正在尝试一个傻瓜 C++ 练习,我遇到了一个错误,说类 'GraduateStudent' 没有任何名为 'advisor' 的字段
- 零四元数和任何向量都不为零的特征积,这是一个错误吗?
- 处理程序的模块列表中有一个错误的模块"WebSocketModule"
- 在 C++ 中使用 "transform" 会给出一个错误,指出这未在作用域中声明
- 在Cython中使用C库时,我遇到了一个错误
- 我需要帮助创建一个评分系统,但它一直给我一个错误,注释掉的整数是给我带来麻烦的部分
- 我试图用c++编写递归fibonacci序列,但当我编译时,我遇到了一个错误
- 从system()调用G++会返回一个错误
- 在Visual Studio中,与std::async一起使用时不调用"thread_local"变量"析构函数,这是一个错误吗?
- 我收到一个错误无效的操作数,类型为 const char [42] 和二进制"运算符+"的双倍数
- 使用声明:GCC 和 Clang 的另一个错误?
- 全球免费给出一个错误.调试器不解释
- 相对于继承的构造函数,gcc 编译器是否还有一个错误?
- 为什么直接传递"this"指针来存档是一个错误,而另一个相同类型的指针是可以的?
- 为什么第三板有一个错误
- 如何编写一个错误结构,该结构可以包含不同的强键枚举作为错误代码
- 使用本地类型声明的G lambda被使用但从未定义 - 确实是一个错误
- 我需要在 Android Studio 中构建 NDK. 但它返回一个错误