【问题标题】:Code example for non-unique namespace-qualified lookup非唯一命名空间限定查找的代码示例
【发布时间】:2014-08-07 17:27:12
【问题描述】:

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

来自 3.4.3.2/3 的引述:

给定 X::m(其中 X 是用户声明的命名空间),或给定 ::m(其中 X 是全局命名空间),如果 S(X, m) 是空集,则程序 格式不正确。否则,如果 S(X, m) 只有一个成员,或者如果 引用的上下文是一个使用声明(7.3.3),S(X,m)是 m 所需的一组声明。否则如果使用 m 是 不是一个允许从 S(X, m) 中选择唯一声明的声明, 程序格式不正确。

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

如果 m 的使用不允许唯一声明 从 S(X, m) 中选择,程序是非良构的。

【问题讨论】:

  • 我的回答有意义吗?有什么问题吗?
  • @ShafikYaghmour 是的,我有一个问题。请查看对您帖子的评论。

标签: c++ namespaces language-lawyer


【解决方案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

【讨论】:

  • 我有一个问题。除了二义性声明的例子之外,是否存在不允许选择唯一声明的例子?
  • @DmitryFucintv 我没有看到这样的例子,我不确定这是否可能。
  • 我理解你。谢谢。
猜你喜欢
  • 2014-08-05
  • 2015-04-11
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
相关资源
最近更新 更多