非唯一命名空间限定查找的代码示例

时间:2014-06-17 15:52:47

标签: c++ namespaces language-lawyer

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)中选择,该程序是不正确的。

1 个答案:

答案 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