使用整数值初始化非const引用

时间:2018-02-08 17:27:17

标签: c++ reference

请考虑以下代码:

#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)初始化非const引用(ref),而以下代码失败:

int& r = 5;

2 个答案:

答案 0 :(得分:5)

test's构造函数:

test(int i)

int作为参数按值

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

test obj(5);

该构造函数的参数i设置为5(即:5被复制到i),然后成员参考ref在构造函数成员初始化列表中使用此参数进行初始化(而不是构造函数调用中使用的文字5):

test(int i):ref(i)

您有一个 danging参考:基准ref会超越所引用的对象(i),由于构造&#39; s参数i不再在构造函数返回后存在。

答案 1 :(得分:4)

引用未直接用5初始化,它正在使用本地i进行初始化。由于i在构造函数退出时被销毁,因此您将留下dangling reference,这是一个引用超出范围的对象的引用。像Clang这样的编译器会告诉你这个问题,警告可能是这样的:

  

警告:绑定参考成员&#39; ref&#39;堆叠分配的参数&#39; i&#39; [<强> -Wdangling场