此规则仍然适用,作为成员变量引用,您必须在构造函数的初始化列表中初始化.例:
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绑定到某个对象的地方.您可以执行此操作的唯一位置是构造函数初始化列表.
您可能还注意到,当您将引用添加为非静态数据成员时,编译器会将(默认构造函数)标记为已删除.