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

ste*_*ett 5 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;
}
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

0: hello world
1: 
Run Code Online (Sandbox Code Playgroud)

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

Nik*_* C. 7

由于向后兼容,0可转换为指针。它被用作 NULL 指针。现在nullptr在用,但0还是需要可转换,否则旧代码编译不出来。

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