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

为何无默认构造函数的C++类可通过C d{};完成对象构造?

问题解答

你的理解有部分是对的:当类存在用户提供的构造函数时,编译器确实不会隐式生成默认构造函数,类C确实没有默认构造函数。但C d{};能正常编译的原因是,这条语句并没有尝试调用默认构造函数,而是匹配了你定义的std::initializer_list<int>版本的构造函数。

核心原因:列表初始化的优先级规则

在C++中,列表初始化(即用{}进行初始化)有特殊的匹配优先级:当类中存在接受std::initializer_list参数的构造函数时,编译器会优先尝试用初始化列表去匹配这个构造函数,即使初始化列表是空的。

对于C d{};,这里的空{}会被解析为一个空的std::initializer_list<int>,因此编译器会调用你定义的C(std::initializer_list<int>)构造函数,而不是寻找默认构造函数,所以代码能够正常编译。

验证:尝试调用默认构造函数会失败

如果把代码改成以下形式,就会触发编译错误,因为此时编译器会尝试调用默认构造函数,而类C并不存在:

int main()
{
    C d; // 编译失败:没有合适的默认构造函数
    d.func();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:02:39