无default constructor的类可进行value initialization的场景咨询
结论
你没有误读C++20标准的8.1.1条款,不存在没有默认构造函数的类可以合法完成值初始化的场景,8.1.1的表述属于标准逻辑完备性的兜底条款,不会产生可编译通过的实际用例。
具体解释
首先明确「无默认构造函数」的定义:
按照11.4.5.2的规则,只要类无法通过0个实参完成构造,就属于无默认构造函数的范畴,最典型的场景就是你提到的:用户自定义了带参构造函数,且没有定义无参构造(也没有用= default生成),同时也没有给所有构造参数设置默认值。8.1.1的逻辑闭环:
值初始化触发时,如果匹配到8.1.1的分支,会先转为执行默认初始化。而默认初始化对于无默认构造函数的类本身就是非法操作,因此整个值初始化流程会直接以编译错误告终,不存在成功执行的可能。
标准之所以要明确这个分支的处理规则,是为了覆盖所有可能的输入情况,避免语义逻辑出现漏洞,哪怕这个分支的最终结果是编译失败。实际用例验证:
对于如下无默认构造函数的类:
struct NoDefaultCtor { NoDefaultCtor(int) {} };
所有触发值初始化的写法,包括NoDefaultCtor a{};、new NoDefaultCtor();、NoDefaultCtor arr[2]{};都会直接编译报错,提示找不到匹配的默认构造函数,和你观察到的现象完全一致。
注意:聚合类的空花括号初始化属于聚合初始化范畴,走单独的初始化流程,不属于值初始化,因此不适用本规则。
内容的提问来源于stack exchange,提问作者Peter - Reinstate Monica
相关产品推荐
相关产品推荐

