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