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及更早版本中:
- 聚合类仅支持大括号形式的聚合初始化,正确写法应为:
MyClass obj{1, std::vector<int>{1,2}}; - 编译器不会为聚合类自动生成匹配成员变量数量的多参数构造函数。编译器默认生成的构造函数只有无参默认构造、拷贝构造、移动构造这几种,不会根据类的成员变量列表自动生成对应的多参数构造。
- 聚合类的设计初衷是直接暴露成员变量,通过聚合初始化完成赋值,而非通过构造函数做封装性的初始化。
直到C20标准才引入了聚合类的小括号初始化支持,允许用小括号语法初始化聚合类,但这一特性在C17中并不存在。
内容的提问来源于stack exchange,提问作者Never Mind
相关产品推荐
相关产品推荐

