C++ 使用整数值初始化非常量引用 请考虑此代码: #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; }

C++ 使用整数值初始化非常量引用 请考虑此代码: #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; },c++,reference,C++,Reference,疑问: 当以下代码失败时,如何使用整数值(5)初始化非常量引用(ref): int& r = 5; 测试的构造函数: test(int i) 按值将int作为参数 通过将5传递给其构造函数来初始化obj对象时,即: test obj(5); 该构造函数的参数i设置为5(即:5复制到i),然后在构造函数成员初始化列表中使用该参数初始化成员引用ref(而不是构造函数调用时使用的文本5): 您有一个挂起的引用:引用ref在被引用对象(i)之外,因为构造函数的参数i在构造函数返回后不再存

疑问: 当以下代码失败时,如何使用整数值(5)初始化非常量引用(ref):

int& r = 5;

测试的
构造函数:

test(int i)
按值将
int
作为参数

通过将
5
传递给其构造函数来初始化
obj
对象时,即:

test obj(5);
该构造函数的参数
i
设置为
5
(即:
5
复制到
i
),然后在构造函数成员初始化列表中使用该参数初始化成员引用
ref
(而不是构造函数调用时使用的文本
5
):



您有一个挂起的引用:引用
ref
在被引用对象(
i
)之外,因为构造函数的参数
i
在构造函数返回后不再存在。

引用不是直接用5初始化的,而是用本地
i
初始化的。由于
i
在构造函数退出时被销毁,因此留下了一个,这是一个引用已超出范围的对象的引用。编译器(如)将告诉您这一点,并提供类似以下内容的警告:

警告:绑定引用成员“ref”到堆栈分配的参数“i”[-Wdangling字段]


它不是用5初始化的,而是用
i
初始化的。对
p()
的调用是UB。当我试图编译此代码时,给我一个警告:“警告:将引用成员'ref'绑定到堆栈分配的参数'I'[-Wdangling field]”。
ref(I)
使用
I
初始化
ref
,当
test
返回时,该本地参数将被销毁,留下一个悬空引用。在此之前,请更正,编译器是5.0版本的
test obj(5);
test(int i):ref(i)