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

C++ global namespace access from within another namespace

本文关键字:命名空间 全局 访问 C++ 另一个      更新时间:2023-10-16

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

one 命名空间中,定义了 foobar 的进一步重载,其中包含 Bar 类型的单个参数。从这个版本的foobar,使用double参数(42.0)对foobar的非限定调用将失败。对foobar的类似调用,这次限定为(::)作用域解析运算符(也带有 double 参数)将成功。

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

为什么这两种情况的行为不同?我同时使用 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;
  }
};

参数相关查找。

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

不适用于double,因为该类型未在任何命名空间中声明。