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

C++17:为何传入参数实例化类时无匹配构造函数?

为何C++17不支持聚合类的多参数小括号初始化

问题重现

定义的类

class MyClass {
public:
    int someMember;
    std::vector<int> someVectorMember;
};

尝试的实例化代码

MyClass(1, std::vector<int>{1,2});

编译错误

main.cpp:21:37: error: no matching function for call to ‘MyClass::MyClass(int, std::vector)’

核心疑问

为何C++17未提供支持该参数列表的默认构造函数?

解答

你的MyClass属于聚合类,C++标准对聚合类的判定条件是:无用户声明的构造函数、无私有/保护的非静态数据成员、无基类、无虚函数。

在C++17及更早版本中:

  1. 聚合类仅支持大括号形式的聚合初始化,正确写法应为:
    MyClass obj{1, std::vector<int>{1,2}};
    
  2. 编译器不会为聚合类自动生成匹配成员变量数量的多参数构造函数。编译器默认生成的构造函数只有无参默认构造、拷贝构造、移动构造这几种,不会根据类的成员变量列表自动生成对应的多参数构造。
  3. 聚合类的设计初衷是直接暴露成员变量,通过聚合初始化完成赋值,而非通过构造函数做封装性的初始化。

直到C20标准才引入了聚合类的小括号初始化支持,允许用小括号语法初始化聚合类,但这一特性在C17中并不存在。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 17:52:51