我知道下面的示例中的编译器将执行该函数First::fun()
,因为依赖于参数的名称查找(ADL)/ Koenig查找,并且要执行Second::fun()
此功能,需要在main
函数中显式调用该函数。
#include <iostream>
using namespace std;
namespace First
{
enum Enum
{
FIRST
};
void fun(First::Enum symbol)
{
cout << "First fun\n";
}
}
namespace Second
{
void fun(First::Enum symbol)
{
cout << "Second fun\n";
}
}
int main()
{
fun(First::FIRST); // Calls First::fun()
}
但是,在fun()
命名空间之外添加另一个函数(请参见下面的代码)并在fun()
没有前缀命名空间的情况下调用时,编译器会产生歧义错误。仍可以通过显式为名称空间添加前缀来调用名称空间中的函数,但是这些功能fun()
是不可访问的。当没有显式调用命名空间时,为什么编译器不喜欢该函数呢?是否有避免此行为的特定原因?
// ^ Namespaces are still here
fun(First::Enum symbol)
{
cout << "No namespace fun\n";
}
int main()
{
fun(First::FIRST); // Doesn't compile: ambiguity!
}
编辑
正如Yksisarvinen正确指出的那样,fun()
仍可以通过在全局名称空间前面加上前缀来调用全局变量::fun(First::FIRST);
。
但是,这仍然给我一个问题:为什么编译器fun()
在模棱两可的调用中不喜欢全局变量?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句