在下面的代码中,我使用文字初始化引用变量。
class ABC
{
public:
const int& a;
ABC():a(43) { }
void newfoo()
{
printf("NEWFOO %d",a);
}
};
int main()
{
ABC obj;
obj.newfoo();
}
该程序的输出是NEWFOO 32767
当我知道下面的代码工作正常时,这似乎不合逻辑。
int main()
{
const int& b=3;
printf("%d",b);
}
这里发生了什么事?如果编译器在初始化引用变量期间声明了某个临时变量,那么该变量的作用域不是在 main 内部,因为该类位于全局作用域中?
Well clang
即使没有任何标志(现场观看 http://coliru.stacked-crooked.com/a/6902abb44681f88b):
warning: binding reference member 'a' to a temporary value [-Wdangling-field]
ABC():a(43) { }
^~
gcc
另一方面需要-Wall
or -Wextra
.
如果我们检查一下这个参考初始化参考 http://en.cppreference.com/w/cpp/language/reference_initialization它说:
绑定到构造函数初始值设定项列表中的引用成员的临时绑定仅持续到构造函数退出为止,而不是只要对象存在就持续存在。
这可以在 C++ 标准草案部分找到12.2
临时对象段落5其中包括以下项目符号
— 构造函数构造函数初始化程序 (12.6.2) 中引用成员的临时绑定将持续存在,直到构造函数退出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)