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

C++ 指针和整数的不明确重载?,c++,pointers,null,integer,overloading,C++,Pointers,Null,Integer,Overloading,以下重载函数 void foo(const void*) { printf(“第一”); } void foo(无符号整数) { printf(“第二”); } 在这种情况下生成一个不明确的重载 foo((int)0); 但这一次不行 foo((int)1); 为什么??是因为人们仍然使用NULL?在没有显式强制转换的情况下,解决问题的最佳方法是什么 (我在Ubuntu 18.04上使用GCC 8.3.0-C++11进行编译) 编辑 正如你们中的一些人在评论中指出的那样,(int)0实际

以下重载函数

void foo(const void*)
{
printf(“第一”);
}
void foo(无符号整数)
{
printf(“第二”);
}
在这种情况下生成一个不明确的重载

foo((int)0);
但这一次不行

foo((int)1);
为什么??是因为人们仍然使用
NULL
?在没有显式强制转换的情况下,解决问题的最佳方法是什么

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

编辑


正如你们中的一些人在评论中指出的那样,
(int)0实际上编译时没有错误(至少在GCC 8.3.0上,使用C++11 std)。我的问题只在<代码> FO(0),现在我明白了。

< P>文字>代码> 0代码>在C和C++中有特殊的含义,因为它也是空指针文字。这就是
NULL
的工作原理

如果使用文本调用函数,而不是
foo(0)
,则可以执行
foo(0u)
,这是因为
0u
已经具有类型
unsigned int
,因此无需进行转换即可调用整数重载。如果使用整数变量调用
foo
,则不应存在任何冲突。(演示)


如注释中所述,
(int)0
不应引起任何冲突,GCC 8.3与
foo((int)0)
在C++11模式下,但在C++98模式下(clang也是如此)。正如@StoryTeller UnslanderMonica在评论中提到的,这是由一个未追溯应用于C++98的缺陷造成的。

事实是,
(int)0
不应引起歧义。只有文字
0
构成空指针常量。强制类型转换表达式不适用。你用什么编译器选项构建的?是的,我无法重现你的问题-对于
(int)0
,第二个重载被调用,正如预期的那样。我可以用gcc重现这个问题,而不是用clang。@IlCapitano-它应该在C++98模式下。这里存在一个未追溯应用于C++03的缺陷。有趣的是,如果从重载解析中删除
foo(unsigned int)
,则代码不会编译。如果两个候选函数的调用不明确,但使用
(int)0
调用唯一的候选函数
foo(const void*)
是不正确的,我不确定为什么函数
foo(const void*)
不会从候选列表中删除。