指针和整数的不明确重载?

Sne*_*ppy 7 c++ null pointers integer overloading

以下重载函数,

void foo(const void*)
{
  printf("first");
}

void foo(unsigned int)
{
  printf("second");
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下会产生不明确的重载

foo((int)0);
Run Code Online (Sandbox Code Playgroud)

但不是在这个

foo((int)1);
Run Code Online (Sandbox Code Playgroud)

为什么?是因为人们还在使用吗NULL?在没有显式强制转换的情况下,解决该问题的最佳方法是什么?

(我在 Ubuntu 18.04 上使用 GCC 8.3.0-C++11 进行编译)

Godbolt 一致性视图

编辑

正如你们中的一些人在评论中指出的那样,(int)0实际上编译没有错误(至少在 GCC 8.3.0 上,使用 C++11 std)。我遇到的问题只是foo(0),我现在明白为什么了。

IlC*_*ano 6

该文字0在 C 和 C++ 中具有特殊含义,因为它也是空指针文字。这就是NULL工作原理。

如果您使用文字调用该函数,则foo(0)可以使用foo(0u),它可以工作,因为0u已经具有 type unsigned int,因此无需转换即可调用整数重载。如果您foo使用整数变量进行调用,则不应有任何冲突。(此处演示)

正如评论中提到的,(int)0不应引起任何冲突,并且 GCC 8.3在 C++11 模式下不会产生任何错误foo((int)0),但在 C++98 模式下会产生任何错误(clang 也是如此)。正如 @StoryTeller-UnslanderMonica 在评论中提到的,这是由缺陷http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#903引起的,该缺陷未追溯应用于 C ++98。