C ++参考初始化

瓦利迪克斯

我对C ++中的引用初始化感到困惑。通常,引用应在声明时进行初始化,但是我发现,当引用为类成员时,引用无需初始化即可声明。

这是特例吗?

正确的规则是什么?

马辛尼

该规则仍然适用,在构造器初始化列表中必须作为初始化的成员变量引用。例子:

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

int main() {
    int i;
    X x(i);
}

如果不初始化它,您将得到编译器错误。


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

根据标准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)
};

直到您创建(定义)X类型的对象,编译器都不会显示任何错误。当你写的时候:

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

编译器会抱怨,这是因为您已经定义了x,这也是必须将xr绑定到某个对象的地方。唯一可以做的地方是在构造函数初始化列表中。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章