秒中引用了一句话。 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;
}
我不明白thar错误。上面的代码与规则不矛盾:
如果S(X,m)只有一个成员,或者是引用的上下文 是一个使用声明(7.3.3),S(X,m)是必需的集合 声明m。
你能解释一下这条规则的意义吗?
答案 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 。