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; }
疑问: 当以下代码失败时,如何使用整数值(5)初始化非常量引用(ref):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在构造函数返回后不再存
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)