C++参考初始化

Wal*_*dix 1 c++ reference

我对C++中的引用初始化感到困惑.通常引用应该在声明时初始化,但我发现当它是类成员引用时,声明而不进行初始化.

这是一个特例吗?

什么是正确的规则?

mar*_*inj 6

此规则仍然适用,作为成员变量引用,您必须在构造函数的初始化列表中初始化.例:

class X {
public:
    X(int& ri) : mri(ri) {}
    // X()  {} // ERROR! no explicit initialization of mri
    int& mri; 
};

int main() {
    int i;
    X x(i);
}
Run Code Online (Sandbox Code Playgroud)

如果没有初始化它,您将收到编译器错误.


(我决定从评论中总结其他很好的说明,以使这个答案更有用)

根据标准8.5.3/3(强调我的):

初始化程序只能在参数声明(8.3.5),函数返回类型的声明中,在类定义(9.2)中的类成员声明中,以及extern说明符是显式的地方被省略.用过的.

所以下面的代码是唯一的定义struct X,其中mri变量只声明.

struct X {  
   int &mri; // declaration of mri (ERROR if you define variable of this struct)
};
Run Code Online (Sandbox Code Playgroud)

如果您创建(定义)X类型的对象,编译器将不会显示任何错误.当你写:

int main() {
    X x; // error, `x.r` is not bound to any object
}
Run Code Online (Sandbox Code Playgroud)

编译器会抱怨,这是因为你已经定义了x,这也是你必须将xr绑定到某个对象的地方.您可以执行此操作的唯一位置是构造函数初始化列表.

您可能还注意到,当您将引用添加为非静态数据成员时,编译器会将(默认构造函数)标记为已删除.

  • 什么是???的投票?这个答案是对的!(我即将发布或多或少相同的答案BTW). (4认同)