重载的函数名称查找

时间:2014-05-31 04:05:47

标签: c++

有3个例子:

int foo(int i){ return 0; }

namespace A
{
    int foo();
    int a = foo(5);//Error: too many argument to function int a::foo()
}

II。

namespace A
{
    int foo(int i){ return 0; }
    int foo(){ return 1; }
    int a = foo(5);//OK, Call A::foo(int)
}

III

namespace A
{
    int foo(){ return 1; }
    int foo(int i){ return 0; }
    int a = foo(5);//OK, Call A::foo(int)
}

究竟用什么规则来确定候选功能集?我认为(3.4.1 / 1)

  一旦找到名称的声明,

名称查找就会结束。

目前尚不清楚在案例II和III中首先会找到什么声明(int foo(int)int foo())?

2 个答案:

答案 0 :(得分:1)

来自§13-1重载

  

如果在同一范围内为单个名称指定了两个或更多不同的声明,则表示该名称   要超载。通过扩展,在同一范围内声明相同名称但具有的两个声明   不同的类型称为重载声明。只有函数和函数模板声明才可以   超载;变量和类型声明不能重载。

由于您在同一名称空间中重载了函数声明,因此非限定名称查找查找匹配函数集和停止。 (我承认这里的标准似乎有点不正确,因为它说“只要找到 声明的名称”。)

因此对于 II III ,非限定名称查找会找到相同的重载函数集。

进一步扩展 III

int foo(int i) { return 42; }
namespace A {
  int foo() { return 1; }
  int foo(int i) { return 0; }
  int a = foo(5); // OK, Call A::foo(int)
}

现在,它可能看起来像 :: foo(int) A :: foo(int)可能不明确但不是因为在查找后不合格的名称查找停止 A :: foo() A :: foo(int)。然后由重载决策来选择最佳的可行功能。

答案 1 :(得分:0)

函数重载仅在函数位于同一名称空间时才有效。也就是说,首先通过命名空间查找名称,然后通过函数签名查找名称。在我的情况下,在A命名空间内有一个名为foo的函数,所以它试图调用它,但是在该命名空间中没有foo 的定义,它接受一个整数参数。

在任何情况下,您都可以按如下方式调用全局foo函数:

int a = ::foo(5);

没有名称空间前缀的双冒号访问全局名称空间。