可能重复:
Why does C++ parameter scope affect function lookup within a namespace?
今天我经历了这种奇怪的行为。我可以先调用strangeFn而不用using namespace Strange
,但是不允许调用strangeFn2为什么?
namespace Strange
{
struct X
{
};
void strangeFn(X&) {}
void strangeFn2(int) {}
}
int main()
{
Strange::X x;
strangeFn(x); // GCC allows calling this function.
strangeFn2(0); // Error: strangeFn2 is not declared in this scope.
return 0;
}
C ++编译器如何解决符号的范围?
答案 0 :(得分:33)
这称为 Argument Dependent Lookup (or Koenig Lookup)
基本上,如果无法解析符号,编译器将查看参数的名称空间。
第二个函数调用失败,因为strangeFn2
在当前命名空间中不可见,也没有在它的参数类型(int
)的命名空间中定义
您可以看到它如何与运算符函数一起使用:
std::complex<double> c, d;
c += d; // wouldn't really work without ADL
或无处不在的iostream运营商:
std::string s("hello world");
std::cout << s << std::endl; // Hello world would not compile without ADL...
为了好玩,这就是hello world看起来像没有ADL (并且没有using
关键字......):
std::string s("hello world");
std::operator<<(std::cout, s).operator<<(std::endl); // ugly!
在存在函数模板的情况下,存在具有ADL和重载解析的阴影角点情况,但我现在将它们置于答案的范围之外。