指针与指针容器的函数重载决议:为何{}匹配指针重载?
为什么空初始化列表会优先匹配指针重载而非vector重载?
核心原因:重载决议的转换优先级差异
当你用{}作为参数调用重载函数时,编译器会依据转换序列的优先级选择最优匹配:
- 对于接受
const int*的重载:空初始化列表{}可直接隐式转换为nullptr,这属于C++标准定义的标准转换序列(空指针转换是内置的、优先级更高的转换)。 - 对于接受
std::vector<const int*>的重载:空列表构造vector需要调用vector的用户定义构造函数,这属于用户定义转换序列,优先级低于标准转换序列。
C++重载决议规则明确:标准转换序列的匹配优先级高于用户定义转换序列,因此编译器会直接选择指针重载,不会判定为调用歧义。
改成引用重载后为什么能解决问题?
当你把指针重载改为void f(const int& i)后,空初始化列表{}无法直接绑定到const int&(左值引用需要绑定到具体的int对象,空列表无法生成合法的int左值),这个重载变得不可行。此时编译器只能选择可用空列表构造的std::vector<const int*>重载,自然就触发了vector版本的调用。
内容的提问来源于stack exchange,提问作者michael3.14
相关产品推荐
相关产品推荐

