非平凡结构体大括号初始化引发异常行为的技术疑问
为什么
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
相关产品推荐
相关产品推荐

