You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何传递{}时重载决议优先选择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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 20:58:10