【问题标题】:Ambiguous overload of pointer and integer?指针和整数的模棱两可的重载?
【发布时间】: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 进行编译)

Godbolt conformance view

编辑

正如你们中的一些人在 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


【解决方案1】:

文字 0 在 C 和 C++ 中具有特殊含义,因为它也是一个空指针文字。这就是NULL 的工作原理。

如果你用文字调用函数,而不是foo(0),你可以使用foo(0u),因为0u已经有unsigned int类型,所以调用整数重载不需要转换.如果您使用整数变量调用foo,则不应该有任何冲突。 (演示here

如 cmets 中所述,(int)0 不应引起任何冲突,GCC 8.3 doesn't produce any errorfoo((int)0) 在 C++11 模式下,但 does 在 C++98 模式下(也是如此)铛)。正如 @StoryTeller-UnslanderMonica 在 cmets 中提到的,这是由一个缺陷 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#903 引起的,该缺陷没有追溯应用于 C++98。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多