【发布时间】:2014-02-21 14:06:40
【问题描述】:
以下代码正常执行(见here):
#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)的标准转换,并且 因此被抑制,当这种直接绑定到左值时 完毕。 ——尾注]
【问题讨论】:
-
经验法则:错误不在于编译器,而在于您对语言的理解。
-
该程序未定义。
-
@CouchDeveloper 是的,这就是我的意思。我会编辑评论。
-
-1:这不是编译器中的错误。这是您代码中的错误。
-
当您使用广泛使用的编译器(如 MS'、gcc、clang 等)时,我建议您始终认为问题出在您的代码中,而不是在编译器的。编译器错误非常少见(尤其是对于稳定版本),而且很可能 99.99% 的问题都出现在这里,这表明“编译器错误”似乎是代码中的错误。
标签: c++ c++11 reference clang++