为何传递{}时重载决议优先选择std::nullptr_t而非自定义类?
为什么调用
f({})会优先选择std::nullptr_t重载? 先看示例代码:
#include <iostream> class empty { }; #if 1 void f(std::nullptr_t) { std::cout << "nullptr\n"; } #endif void f(empty) { std::cout << "empty\n"; } int main() { f({}); }
这段代码在两个重载都存在时输出nullptr,禁用std::nullptr_t重载后输出empty,核心依据C++重载决议的两条关键规则:
- 空列表与
std::nullptr_t的直接匹配:空初始化列表{}是std::nullptr_t的合法初始化方式,这种匹配属于标准转换序列,是编译器认定的最高优先级转换之一。 - 用户定义转换的优先级更低:调用
f(empty)需要触发empty的默认构造函数,这属于用户定义的隐式转换序列。在重载决议的优先级排序中,标准转换序列的优先级高于用户定义的转换序列。
因此当两个重载都可用时,编译器会优先选择接受std::nullptr_t的版本。
内容的提问来源于stack exchange,提问作者fbrereto
相关产品推荐
相关产品推荐

