【问题标题】:Qualified name lookup in the name名称中的限定名称查找
【发布时间】:2014-06-04 17:27:30
【问题描述】:

我想了解命名空间限定名查找规则。我正在尝试在示例中这样做:

namespace A
{
    int a=::b; //error: ‘::b’ has not been declared
}
int b=6;

我的推理中引用了一个引用 (3.4.3.2/2 N3797):

对于命名空间 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 和 它的内联命名空间集。

X 成为一个全局范围。我们有S(X,b)={int b=6}。这意味着名称查找必须成功。但实际上,该程序是格式错误的。可能我没有正确理解这条规则吗?

【问题讨论】:

  • 关键就在您加粗的文本中。名称查找成功的。但是,b 尚未添加到“全局命名空间中所有声明的集合”中。
  • @Lilshieste 但是我们可以在实际数据成员声明之前出现的成员函数定义中使用类数据成员。
  • 但这是范围问题;不是名称查找。 (而 3.3.7/1 为类类型提供了这种能力。)
  • @Lilshieste 我不同意,因为非限定名称查找被描述为对应于成员的类范围。这些概念是相互关联的(不是正式的)。
  • 3.4.1/1 提到“在范围内搜索声明......”。对于类范围,声明的顺序无关紧要,根据 3.3.7/1。对于全局范围,声明的顺序确实很重要。但在这两种情况下,声明必须出现在名称查找之前。

标签: c++ namespaces qualified-name


【解决方案1】:

b 在全局范围内,但必须在使用它之前声明。 喜欢

int b=6;
namespace A
{
    int a=::b; 
}

(N 3690 Draft) 3.4.1 Unqualified name lookup 4. A name used in global scope, outside of any function, class or user-declared namespace, shall be declared before its use in global scope.

【讨论】:

  • 标准中的哪里说的?
  • 这是在3.4.1 Unqualified name lookupN 3690下给出的
  • 是非限定名查找
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 2013-11-04
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
相关资源
最近更新 更多