【发布时间】:2020-10-18 11:19:54
【问题描述】:
下面的重载函数,
void foo(const void*)
{
printf("first");
}
void foo(unsigned int)
{
printf("second");
}
在这种情况下生成一个模糊重载
foo((int)0);
但不在这个
foo((int)1);
为什么?是因为人们还在使用NULL吗?如果没有明确的演员表,解决这个问题的最佳方法是什么?
(我在 Ubuntu 18.04 上使用 GCC 8.3.0-C++11 进行编译)
编辑
正如你们中的一些人在 cmets 中指出的那样,(int)0 实际上编译时没有错误(至少在 GCC 8.3.0 上,使用 C++11 标准)。我遇到的问题只是foo(0),现在我明白了。
【问题讨论】:
-
事实是,
(int)0不应该引起歧义。只有文字0构成空指针常量。强制转换表达式没有。您使用哪些编译器选项构建? -
是的,我无法重现您的问题wandbox.org/permlink/GKRgIv2CTNZ7XhR9 - 对于
(int)0,第二个重载被调用,正如预期的那样。 -
我可以用 gcc 复制这个 here,而不是用 clang。
-
@IlCapitano - 它应该在 C++98 模式下。没有追溯应用到 C++03 的缺陷 open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#903 在这里起作用。
-
有趣的是,如果您从重载决议中删除
foo(unsigned int),代码将无法编译。我不知道为什么函数foo (const void*)没有从候选列表中删除,如果有两个候选,调用是模棱两可的,但是用(int)0调用唯一的候选foo(const void*)是不正确的。
标签: c++ pointers null integer overloading