c++ - namespace 标识符的范围是什么?

标签 c++ language-lawyer

对于命名空间标识符<的声明点声明区域范围似乎没有明确的定义/strong>,除了那些 namespace 内的标识符——根据标准 (§3.3.6/1)。

The declarative region of a namespace-definition is its namespace-body. The potential scope denoted by an original-namespace-name is the concatenation of the declarative regions established by each of the namespace-definitions in the same...

虽然标准确实讨论了那些声明——命名空间定义是声明,但这不适用于命名空间定义的情况,因为它没有声明符,也不是初始化符——根据标准(§3.3.2/1)。

The point of declaration for a name is immediately after its complete declarator (Clause 8) and before its initializer (if any), except as noted below...

那么,如何确定命名空间标识符呢?

最佳答案

根据您从标准中引用的文字,我的解释是您已经回答了您自己的问题。

正如您所说,命名空间不能有完整的声明符,因为可以在任何命名空间的任何编译单元(即源文件或该源文件包含的 header )中为它创建一个额外的声明区域 X通过 namespace X { <new names within this declarative region> } .

因为永远不可能有完整的命名空间声明,所以永远不会有命名空间的声明点。由于没有声明点,因此没有命名空间标识符这样的东西,也没有一个范围这样的东西。

这意味着命名空间只是一个标签,它可以是标识符的一部分。 istream是命名空间内的标识符 std ,该标识符的完整名称(从命名空间 std 的声明区域之外的代码引用)是 std::istream .所有 using namespace std;确实是,当试图找到潜在标识符的匹配项时 foo是告诉编译器在命名空间 std 中查找(或它具有可见性的声明区域)用于名为 foo 的标识符这将是一场候选比赛。 [这就是为什么using namespace如果不止一个命名空间包含相同的标识符,那么多个命名空间可能会导致歧义。

关于c++ - namespace 标识符的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247975/

相关文章:

c++ - SQLite重命名空表

c++ - 默认函数可以自动返回吗?

c++ - 哪些替换失败在 requires 子句中是不允许的?

c++ - SFINAE 是否适用于功能体?

c++ - 一个 union 内的不同匿名 union 之间具有相同名称的字段

c++ - 类方法的向量化

c++ - 用户可以在当前 token 之前编辑无效代码吗?

c++ - 如何在 .cpp 文件中使用 C++ 关键字?

c++ - 提升 lambda 与 phoenix

c++ - 在模板类中声明与 friend 相同的模板类?