C++初始化异常行为探究:自定义构造函数存在时编译失败的原因分析
问题原因解析
这事儿得从C++里**聚合类型(aggregate type)**的规则和构造函数匹配逻辑说起,我给你拆解清楚:
1. 带双参数构造函数时的报错原因
当你在node结构体中定义了双参数构造函数node(int a, int b)后,这个结构体就不再属于聚合类型了——C++标准明确规定:只要类/结构体存在任何用户声明的构造函数(哪怕是被delete的、哪怕是多参数的),它就失去了聚合类型的资格。
此时你写node a = {3};,编译器不会走聚合初始化的逻辑,而是会尝试匹配合适的构造函数来完成初始化。这里的{3}是单个int的初始化列表,编译器会优先寻找能接受单个int参数的构造函数,结果发现你已经把node(int val)显式delete了,于是就抛出了use of deleted function node::node(int)的错误。
2. 移除双参数构造函数后正常编译的原因
当你删掉那个双参数构造函数后,node结构体里不再有任何用户声明的构造函数,这时候它就符合聚合类型的判定标准了。
对于聚合类型,C++支持部分列表初始化:你用{3}初始化时,只会给第一个成员val赋值为3,剩下的成员val2会被自动值初始化(对于int类型来说,值初始化的结果就是0)。所以代码能正常编译运行,最终输出3 0。
额外补充:哪怕你只声明了一个被delete的构造函数,只要是用户显式声明的,类型就会失去聚合类型的资格——这也是为什么你原来的代码里,即使单参数构造函数被delete,依然会报错的核心原因。
内容的提问来源于stack exchange,提问作者syacer
相关产品推荐
相关产品推荐

