You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

类的引用成员能否有类内初始化器?对C++ Primer描述存疑

关于C++合成默认构造函数与引用成员的疑问解答

问题核心

阅读《C++ Primer》第13.1.6节时,对“合成默认构造函数被定义为删除”的条件存在困惑:书中提到该条件包括无类内初始化器(in-class initializer)的引用成员,但认知里引用成员不应有类内初始化器,疑惑是否可直接理解为“存在引用成员”。

解答说明

这一困惑源于C++标准版本的差异,以及语法规则和编程习惯的区别:

  1. C++11之前的规则
    在此版本之前,引用成员确实不允许使用类内初始化器,此时只要类中存在引用成员,合成默认构造函数必然会被删除——因为引用必须绑定到具体对象,而默认构造函数无法完成这一绑定操作。这种场景下,书中的描述等价于“存在引用成员”。

  2. C++11及之后的规则
    标准放宽了限制,允许引用成员使用类内初始化器(需满足初始化器是常量表达式,或绑定到全局/静态对象等合法场景),示例代码如下:

    class Demo {
        int val = 20;
        int& ref = val; // 合法的类内初始化,引用绑定到类内成员val
    };
    

    这种情况下,类虽然包含引用成员,但类内初始化器已经完成了引用的绑定,合成默认构造函数可以正常生成,不会被删除。

  3. 编程习惯与语法规则的区别
    你提到的“引用成员不应拥有类内初始化器”更偏向于编程习惯:多数场景下,引用成员需要绑定到外部传入的对象,这时确实会通过带参数的构造函数初始化,而非类内初始化器,但这并非语法上的强制禁止。

结论

不能直接将书中的描述简化为“或存在引用成员”。书中的表述是严谨的,覆盖了C++11及之后的标准场景:只有当引用成员没有类内初始化器时,合成默认构造函数才会被删除——因为此时默认构造函数无法完成引用的绑定要求。

内容的提问来源于stack exchange,提问作者phantom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 19:35:59