使用大括号+nullptr构造unique_ptr时编译器报歧义错误原因
编译歧义错误原因分析
这个错误的核心是C++列表初始化的重载决议规则与std::unique_ptr的构造函数设计共同作用的结果:
- 当你使用
{ nullptr }初始化std::unique_ptr<MetaDataDictionary>时,编译器会找到两个可行的构造函数:- 专门接收
std::nullptr_t类型参数的构造函数(unique_ptr(nullptr_t)) - 接收
MetaDataDictionary*指针类型的构造函数(unique_ptr(pointer))
- 专门接收
- 由于
std::nullptr_t可以隐式转换为任意原生指针类型,这两个构造函数对nullptr参数的匹配优先级完全相同(均属于标准转换序列),编译器无法确定应该调用哪一个,因此抛出歧义错误。 - 而使用空的
{}初始化时,触发的是std::unique_ptr的默认构造函数,直接创建空智能指针,不需要匹配带参数的构造函数,因此没有重载冲突。
至于无法在GodBolt复现的问题,大概率是ITK项目中MetaDataDictionary的定义存在特殊上下文(比如宏修改了指针类型别名、项目中存在额外的隐式转换规则),但核心的歧义触发逻辑还是上述的列表初始化重载决议问题。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

