【问题标题】:C++ global namespace access from within another namespace从另一个命名空间内访问 C++ 全局命名空间
【发布时间】:2012-08-06 02:38:57
【问题描述】:

在下面的 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;
  }
};

【问题讨论】:

    标签: c++ namespaces operator-overloading scope-resolution


    【解决方案1】:

    Argument dependent lookup.

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

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

    【讨论】:

    • 作为对最后一句的补充:一旦找到匹配的 name,不合格名称查找就会停止,首先考虑本地范围,并且仅当它没有找到任何在那里命名它将搜索上层和全局范围。
    • @Xeo:这是否意味着对foobar(f) 的调用会在找到foobar(Bar b) 时失败?
    • @user643722: 不。因为f 是类类型,所以除了非限定查找之外,ADL 也完成了。
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 2011-01-13
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2015-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多