从另一个命名空间内访问C++全局命名空间

use*_*370 9 c++ namespaces operator-overloading scope-resolution

在下面的C++代码中,foobar首先为单个double参数定义,然后再为单个参数类型定义Foo.两者都在全局命名空间中定义.

one命名空间内foobar,使用单个参数类型定义了进一步的重载Bar.从这个版本中foobar,一个不合格的调用foobardouble参数(42.0)将失败.类似的调用foobar,这次使用(::)范围解析运算符限定,也使用double参数,但是会成功.

另一方面,foobar带有类型参数的非限定调用Foo成功.使用范围解析运算符限定foobarFoo参数调用也会成功.

为什么这两种情况的表现不同?我同时使用gcc 4.7和clang ++ 3.2.

struct Foo {};
struct Bar {};

double foobar(double x) { return x; }
Foo    foobar(Foo f)    { return f; }

namespace one {

  Bar foobar(Bar b) {
    //foobar(42.0); // error: can't convert to Bar
    ::foobar(42.0);

    Foo f;
      foobar(f);    // no problem
    ::foobar(f);
    return b;
  }
};
Run Code Online (Sandbox Code Playgroud)

Bo *_*son 8

参数依赖查找.

在将foobar(f)来自命名空间的调用函数Foo中将被考虑.

不起作用,double因为该类型未在任何名称空间中声明.