有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()
)?
答案 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);
没有名称空间前缀的双冒号访问全局名称空间。