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

Code example for non-unique namespace-qualified lookup

本文关键字:查找 代码 唯一 空间      更新时间:2023-10-16

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)用于X和中使用指令指定的所有命名空间Ni它的内联命名空间集。

引用自3.4.3.2/3:

给定X::m(其中X是用户声明的命名空间),或给定::m(其中X是全局命名空间),如果S(X, m)是空集,则程序是不规范的。否则,如果S(X, m)只有一个元素,或者如果引用的上下文是using声明(7.3.3),S(X, m)是如果m的使用是,则使用不允许从S(X, m)中选择唯一声明,

你能举个例子来说明这个规则吗:

如果m的使用不允许唯一声明,则使用

从S(X, m)中选择,程序是病态的。

标准草案实际上提供了一个例子,虽然它不是很容易找到,它在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