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

非平凡结构体大括号初始化引发异常行为的技术疑问

为什么std::vector<C> d = { {} };不报错且size为0?

这不是异常行为,是C++列表初始化的规则导致的,具体原因如下:

1. 编译通过的原因

当你用std::vector<C> d = { {} };初始化容器时,编译器首先尝试匹配vector的std::initializer_list<T>构造函数,试图将内层的{}转换为C对象。但由于C的成员B没有默认构造函数,无法通过{}默认初始化C,这条构造路径走不通。

此时编译器会回退到匹配vector的其他构造函数,最终匹配到无参默认构造函数——这条路径是可行的,因此编译器不会抛出错误,而是创建一个空的vector。

2. size为0的原因

因为最终调用的是vector的默认构造函数,该构造函数会生成一个不包含任何元素的空容器,所以d.size()返回0,而非你预期的1。

3. 其他代码的差异解释

  • std::vector<C> d2 = { C() };:这里明确要求构造一个C对象作为初始化列表的元素,但C()需要默认构造C,而B无法默认构造,因此触发编译错误。
  • C c;:直接默认构造C,同样因B无默认构造函数而报错。
  • d.push_back( {} );:尝试用{}构造C对象并添加到容器,同样因B无法默认构造而失败。
  • d.push_back( { {}, { 3 } } );:这里通过聚合初始化构造C:A默认构造,B用int参数构造,符合规则,因此可以成功执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:25:20