类的引用成员能否有类内初始化器?对C++ Primer描述存疑
关于C++合成默认构造函数与引用成员的疑问解答
问题核心
阅读《C++ Primer》第13.1.6节时,对“合成默认构造函数被定义为删除”的条件存在困惑:书中提到该条件包括无类内初始化器(in-class initializer)的引用成员,但认知里引用成员不应有类内初始化器,疑惑是否可直接理解为“存在引用成员”。
解答说明
这一困惑源于C++标准版本的差异,以及语法规则和编程习惯的区别:
C++11之前的规则
在此版本之前,引用成员确实不允许使用类内初始化器,此时只要类中存在引用成员,合成默认构造函数必然会被删除——因为引用必须绑定到具体对象,而默认构造函数无法完成这一绑定操作。这种场景下,书中的描述等价于“存在引用成员”。C++11及之后的规则
标准放宽了限制,允许引用成员使用类内初始化器(需满足初始化器是常量表达式,或绑定到全局/静态对象等合法场景),示例代码如下:class Demo { int val = 20; int& ref = val; // 合法的类内初始化,引用绑定到类内成员val };这种情况下,类虽然包含引用成员,但类内初始化器已经完成了引用的绑定,合成默认构造函数可以正常生成,不会被删除。
编程习惯与语法规则的区别
你提到的“引用成员不应拥有类内初始化器”更偏向于编程习惯:多数场景下,引用成员需要绑定到外部传入的对象,这时确实会通过带参数的构造函数初始化,而非类内初始化器,但这并非语法上的强制禁止。
结论
不能直接将书中的描述简化为“或存在引用成员”。书中的表述是严谨的,覆盖了C++11及之后的标准场景:只有当引用成员没有类内初始化器时,合成默认构造函数才会被删除——因为此时默认构造函数无法完成引用的绑定要求。
内容的提问来源于stack exchange,提问作者phantom
相关产品推荐
相关产品推荐

