gpt4 book ai didi

c++ - 指针和整数的模糊重载?

转载 作者:行者123 更新时间:2023-12-03 06:51:58 26 4
gpt4 key购买 nike

以下重载函数,

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

最佳答案

文字 0在 C 和 C++ 中具有特殊含义,因为它也是空指针字面量。就是这样NULL作品。
如果您使用文字调用函数,而不是 foo(0)你可以做 foo(0u) ,这是因为 0u已经有类型 unsigned int ,因此调用整数重载不需要转换。如果您正在调用 foo使用整数变量,不应该有任何冲突。 (演示 here)
正如评论中提到的,(int)0不应该引起任何冲突,并且 GCC 8.3 doesn't produce any errorfoo((int)0)在 C++11 模式下,但 does在 C++98 模式下(clang 也是如此)。正如@StoryTeller-UnslanderMonica 在评论中提到的,这是由缺陷引起的 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#903这并未追溯应用于 C++98。

关于c++ - 指针和整数的模糊重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64412688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com