使用声明和模糊声明的上下文

时间:2014-06-17 15:48:49

标签: c++ namespaces language-lawyer

秒中引用了一句话。 3.4.3.2/3:

  

给定X :: m(其中X是用户声明的命名空间),或给定:: m(其中   如果S(X,m)是空集,程序,则X是全局名称空间   是不正确的。 否则,如果S(X,m)只有一个成员,或者如果   引用的上下文是using-declaration(7.3.3),S(X,m)   是m。

所需的声明集

S(X,m)的定义如下。 3.4.3.2/2:

  

对于名称空间X和名称m,名称空间限定的查找集S(X,   m)定义如下:设S(X,m)为所有声明的集合   X中的m和X的内联命名空间集(7.3.1)。如果S(X,m)是   非空,S(X,m)是S(X,m);否则,S(X,m)是联合的   所有命名空间的S(Ni,m)Ni由X和中的using指令指定   它的内联命名空间集。

现在考虑以下代码:

#include <iostream>

using namespace std;
namespace N
{
    int cout = 6;
}
using namespace N;

int main() {
    using ::cout;//error: reference to ‘cout’ is ambiguous
    return 0;
}

我不明白th​​ar错误。上面的代码与规则不矛盾:

  

如果S(X,m)只有一个成员,或者是引用的上下文   是一个使用声明(7.3.3),S(X,m)是必需的集合   声明m。

你能解释一下这条规则的意义吗?

1 个答案:

答案 0 :(得分:1)

德米特里,我怀疑你误解了“如果引用的上下文是 using-declaration ”的意思。 “在 using-declaration 的上下文中”并不意味着“在 using-declaration 中使用时”。它的意思是“当引用是 using-declaration ”的主题时。假设您的代码更改如下:

int main() {
    using N::cout;
    std::cout << "value=" << cout << '\n';
}

请注意cout中使用不合格的std::cout << "value=" << cout << '\n'。该无保留引用的上下文是 using-declaration using N::cout

另一种查看标准含义的方法是 using-declaration 优先于 using-directive