以下是重载函数,
生成了一个在这种情况下模棱两可的重载。
为什么?是因为人们仍然使用NULL吗?在不进行显式转换的情况下,解决问题的最佳方法是什么?
(我使用GCC 8.3.0-C++11在Ubuntu 18.04上编译) Godbolt一致性视图 编辑
正如你们中的一些人在评论中指出的那样,(int)0实际上可以编译而没有错误(至少在GCC 8.3.0中,使用C++11 std)。我遇到的问题只是在foo(0)中,现在我明白了原因。
void foo(const void*)
{
printf("first");
}
void foo(unsigned int)
{
printf("second");
}
生成了一个在这种情况下模棱两可的重载。
foo((int)0);
但不在这个里面
foo((int)1);
为什么?是因为人们仍然使用NULL吗?在不进行显式转换的情况下,解决问题的最佳方法是什么?
(我使用GCC 8.3.0-C++11在Ubuntu 18.04上编译) Godbolt一致性视图 编辑
正如你们中的一些人在评论中指出的那样,(int)0实际上可以编译而没有错误(至少在GCC 8.3.0中,使用C++11 std)。我遇到的问题只是在foo(0)中,现在我明白了原因。
(int)0
不应引起歧义。只有字面值0
才构成空指针常量,而强制类型转换表达式并不构成。你使用了哪些编译器选项来构建代码? - StoryTeller - Unslander Monica(int)0
,按预期调用了第二个重载。 - StoryTeller - Unslander Monicafoo(unsigned int)
,代码将无法编译。我不确定为什么函数foo(const void*)
在有两个候选项时调用模糊,但是使用(int)0
调用唯一的候选者foo(const void*)
是不正确的。 - NotAProgrammer