【问题标题】:How is the following passage from the standard to be interpreted?如何解释标准中的以下段落?
【发布时间】:2014-07-20 22:35:05
【问题描述】:

§3.3.6/1 (C++11)

namespace-definition 的声明区域是它的namespace-body。潜在范围由 original-namespace-name 是由每个 namespace-definitionsoriginal-namespace-name 在同一声明区域中。...

声明性区域的定义如下(§3.3.1/1):

每个名称都在程序文本的某些部分引入,称为声明区域,这是最大的部分 该名称在其中有效的程序的名称,即该名称可用作非限定名称的程序 指代同一个实体。 ...

两者加在一起似乎意味着命名空间的名称只能在命名空间主体内部使用(不合格)。但是,很明显,这是错误的。那么,当命名空间的名称实际上可以在命名空间主体之外使用(非限定)时,命名空间定义的声明性区域作为主体意味着什么?

另外,我根本不明白这一点(从上面重新引用):

潜在范围由 original-namespace-name 是由每个 namespace-definitions 在与 original-namespace-name 相同的声明区域中。

【问题讨论】:

  • 我认为“该名称可能用作非限定名称来指代同一实体”是挂断。使用不合格名称进行引用时,这意味着没有歧义。
  • 恕我直言@BobbyDigital 是对的。至于最后一部分,我认为它只是说明了命名空间可以嵌套的事实,并且为了限定它们,它们的限定符使用:: 连接。
  • @BobbyDigital 我不太明白,你能详细解释一下吗?
  • @Brian 重点是'be used as an unqualified name' 可以在相同的命名空间范围。
  • 也许 - 没有可能的歧义 - 更清楚。我们都知道您可以在文件中使用非限定名称,但不能保证在其自己的声明区域内不会发生冲突。至少我是这么看的。

标签: c++ c++11 namespaces scope language-lawyer


【解决方案1】:

标准不是在谈论你的想法......

我认为您的困惑在于您错误地假设文本是关于命名空间名称本身的事实,而标准实际上是在讨论在相关命名空间内部引入的名称。 p>


引用的“只是没有意义”的内容呢?

由 original-namespace-name 表示的潜在范围是由具有该 original-namespace-name 的同一声明区域中的每个命名空间定义建立的声明区域的串联。


上面的例子可能最容易描述:

.--- namespace definition
|        .--- original-namespace-name
v        v
namespace N { <-------------------------------.
  int x = 0;                              <---+--- declarative region (1)
} <-------------------------------------------'

.--- another namespace definition of `N`
|         .--- original-namespace-name
v         v
namespace N { <-------------------------------.
  int y = x;                              <---+--- declarative region (2)
} <-------------------------------------------'

注意int x的潜在作用域是(1)(2),即。 “声明性区域的连接”介绍。

  • 在示例中,我们有两个 namespace-definitions 用于 original-namespace-name N,我们还有两个 声明性区域,但名为N 的命名空间内的“潜在范围”既是(1),又是(2)

  • 只要命名空间定义本身在同一个声明区域,并且共享同一个original-namespace-name ,它们引用相同的命名空间。

  • 引入另一个这样的命名空间定义只会为潜在范围增加更多空间(通过附加另一个声明区域)之前在其中声明的变量。


潜在范围声明区域;它们是什么?

  • a declarative region 是程序的一部分,可以在其中引用名称而无需限定。

  • potential scope 是名称​​可能有效的范围,它是名称可能的整个范围> 引用同一个实体。


3.3.1p1 声明性区域和范围 [basic.scope.declarative]

每个名称都被引入到程序文本的某个部分,称为声明性区域,这是程序中该名称​​有效的最大部分,也就是说,其中名称可以用作非限定名称来指代同一实体。

通常,每个特定名称仅在程序文本的某些可能不连续的部分(称为其范围)内有效。为了确定声明的范围,有时方便参考声明的潜在范围

声明的范围与其潜在范围相同,除非潜在范围包含另一个同名声明。在这种情况下,内部(包含)声明性区域中的声明的潜在范围被排除在外部(包含)声明性区域中的声明范围之外。

【讨论】:

  • 关于区域和范围的添加部分使其非常直观。 +1
猜你喜欢
  • 1970-01-01
  • 2022-10-15
  • 2020-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-02
  • 1970-01-01
  • 2011-04-19
相关资源
最近更新 更多