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指令指定 它的内联命名空间集。
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的必要声明集。否则如果使用m是 不允许从S(X,m)中选择唯一的声明, 该计划格式不正确。
您能举个例子来证明这条规则:
如果m的使用不是允许唯一声明的那个 从S(X,m)中选择,该程序是不正确的。
答案 0 :(得分:1)
草案标准实际上提供了一个例子,虽然它不是很容易找到,是在 3 段下,如下所示,给出以下内容:
namespace A {
using namespace Y;
void f(int);
void g(int);
int i;
}
namespace B {
using namespace Z;
void f(char);
int i;
}
namespace AB {
using namespace A;
using namespace B;
void g();
}
示例中隐含着以下内容:
AB::i++; // i is not declared directly in AB so the rules are
// applied recursively to A and B,
// S is { A::i , B::i } so the use is ambiguous
// and the program is ill-formed