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

C++17派生类构造初始化及与基类构造using声明的疑问

问题描述

我在浏览代码时发现一段本以为会触发编译错误的代码,实际却能正常编译运行,简化后的代码如下:

class Base
{
public:
   Base(int i)
   {}
};


class Derived : public Base
{
public:
   //using Base::Base;
};


int main()
{
    Derived obj{ 5 };
}

通过cppinsights查看该代码片段,在C17及更高版本中,main函数内的语句会被解析为Derived obj = {Base(5)};,但在C14及更早版本中无法编译。在C++14中取消注释//using Base::Base;后代码可编译,此时cppinsights会解析为Derived obj = Derived{5};,这部分我能理解。

我有以下疑问:

  1. 为何原代码在C++17中可以编译?该特性的名称是什么?
  2. {Base(5)};的含义是什么?其中大括号的作用是什么?
  3. 该特性与using Base::Base;是否有关联,还是二者完全不同?

另外,我修改了main函数的代码如下,以展示cppinsights的解析结果:

int main()
{
    Derived obj1{ 5 }; // OK. cppinsights: Derived obj1 = {Base(5)};
    Derived obj2 = {Base(5)}; // OK. cppinsights: {Base(Base(5))};
    //Derived obj3 = Base{5}; // error: no viable conversion from 'Base' to 'Derived'
}
问题解答

1. C++17编译通过的原因及特性名称

这是C17新增的聚合类继承初始化特性。在C17之前,聚合类不能包含基类;C++17放宽了聚合类的定义:只要类没有用户声明的构造函数、没有私有/保护的非静态数据成员、没有虚函数、没有虚基类,即便继承了基类,仍属于聚合类。

你的Derived类完全符合聚合类的判定条件:无用户声明的构造函数,继承的是公有基类Base,其他限制条件也满足。对于这类聚合类,C++17允许通过初始化列表直接初始化基类部分——即Derived obj{5};执行时,编译器会自动将5传递给基类Base的构造函数完成初始化,本质是聚合初始化机制的扩展,允许初始化聚合类的基类子对象。

2. {Base(5)}的含义与大括号的作用

这里的大括号是聚合初始化列表。Derived作为C++17中的聚合类,当你用Derived obj{5};时,编译器会将初始化列表中的元素对应到聚合类的基类(若有)和成员变量。此处5被用于初始化Derived的基类Base,cppinsights解析为Derived obj = {Base(5)};,意思是用Base(5)临时对象初始化Derived的基类子对象,这是聚合初始化的典型表现:初始化列表中的元素依次完成聚合类基类、成员变量的初始化。

大括号的核心作用是触发聚合初始化机制,告知编译器按照聚合类的规则完成对象初始化,而非调用派生类的构造函数(因为Derived没有用户声明的构造函数)。

3. 与using Base::Base;的关联与区别

二者是完全独立的特性:

  • using Base::Base;是继承构造函数特性(C++11引入),作用是将基类的构造函数引入派生类作用域,让派生类自动拥有基类的构造函数。此时Derived obj{5};会直接调用继承来的Base(int)构造函数创建Derived对象,cppinsights解析为Derived obj = Derived{5};就是这个逻辑。
  • C++17的聚合类继承初始化属于聚合初始化规则的扩展,不需要继承构造函数,只要派生类是聚合类,就能通过初始化列表直接初始化基类部分,本质是聚合初始化的范畴,并没有让派生类拥有基类的构造函数,只是允许在初始化聚合类时直接操作基类子对象。

针对你修改后的main代码补充说明:

  • Derived obj2 = {Base(5)};能编译,是因为聚合初始化允许用基类临时对象初始化派生类的基类子对象;
  • Derived obj3 = Base{5};编译失败,是因为不存在Base到Derived的隐式转换规则——聚合初始化不支持这种直接的对象赋值转换,继承构造函数也不会生成对应的转换函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 00:50:08