c++ - 为什么重载决议选择指针类型为 0 而不是 1,在任何一种情况下它都可以选择省略号?

标签 c++ overloading overload-resolution

我有以下代码片段:

void eval(void*) { std::cout << "hello world\n"; }
void eval(...) { }
int main(int argc, char *argv[])
{
    std::cout << "0: "; eval(0);
    std::cout << "1: "; eval(1);
    return 0;
}

这给出了输出:
0: hello world
1: 

我的问题是:为什么重载解析选择void* eval 的版本而不是 ... 0 的版本,但不适用于 1 ?似乎在这两种情况下,它都可以推断出参数是一个 int 并采用可变参数版本。

最佳答案

由于向后兼容,0可转换为指针。它被用作 NULL 指针。现在 nullptr已使用,但 0仍然需要可转换,否则旧代码将不再编译。

如果您在编译器中启用最高警告级别进行编译,则编译器很可能会在 0 时警告您。用作指针。

关于c++ - 为什么重载决议选择指针类型为 0 而不是 1,在任何一种情况下它都可以选择省略号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60531298/

相关文章:

c++ - c++ std map erase函数是否释放指针键的内存?

c++ - 是否可以在 header 中声明 constexpr 类并将其定义在单独的 .cpp 文件中?

c++ - 当作为 QDBusVariant/QVariant 发送时 Qt DBus 解码

c++ - 使用 clCreateEventFromGLsyncKHR 扩展函数时出现链接错误

emacs - Emacs/Elisp 中的多态回调

Java 8 通用函数应该是模棱两可的,但在运行时失败

PHP通过引用重载返回,更新数组中的值

c++ - 运算符重载 <<

c++ - 使用默认函数模板参数的意外重载决议

c++ - 数组到指针的转换 + rvalue-ref : Overload resolution difference GCC vs clang