为什么GCC允许在不使用其命名空间的情况下调用此函数?

时间:2011-11-01 10:41:06

标签: c++ namespaces scope

  

可能重复:
  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 ++编译器如何解决符号的范围?

1 个答案:

答案 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和重载解析的阴影角点情况,但我现在将它们置于答案的范围之外。