【发布时间】:2018-02-08 17:27:17
【问题描述】:
请考虑以下代码:
#include <iostream>
using namespace std;
class test
{
int& ref;
public:
test(int i):ref(i)
{
cout << "Constructor Called" << endl;
}
void p(){ cout<< ref << "\n";}
};
int main()
{
test obj(5);
obj.p();
return 0;
}
输出:
Constructor Called
5
疑问: 此处如何使用整数值 (5) 初始化非常量引用 (ref),而以下代码失败:
int& r = 5;
【问题讨论】:
-
它不是用 5 初始化的,而是用
i初始化的。对p()的调用是UB。 -
GCC 7.2 在我尝试编译时给了我一个警告:“警告:将引用成员 'ref' 绑定到堆栈分配的参数 'i' [-Wdangling-field]”。
-
ref(i)用i初始化ref,这是一个在test返回时将被销毁的本地参数,给您留下一个悬空引用。 -
之前,更正,编译器是 Clang 5.0