【发布时间】:2019-11-07 13:04:52
【问题描述】:
为什么外部声明引入的名称只允许来自最内层的封闭命名空间?如果不是,它会引起什么并发症?还是只是因为这部分标准是从 C 标准中复制而来的,没有命名空间?
Please see the respective part of the standard
编辑:
一个可以方便地进行限定的示例场景:在命名空间 ns 中的函数模板 f 中使用 x,其中 x 定义在全局命名空间中的某处,不希望引入(在函数之外定义)在所有#include标头带有f的翻译单元中。
namespace ns
{
template <typename> void f()
{
// extern int ::x; // ill-formed
extern int x; // refers to ns::x, which is not the case :(
++x;
}
}
【问题讨论】:
-
引用的段落没有说明任何名称的限定。它只在两个声明声明同一个实体时才说。
-
@n.'pronouns'm.: 忽略在最里面的封闭命名空间范围之外声明的实体;这个(不完整的)声明明确禁止使用这个声明链接到所述命名空间之外的任何名称。也许资格本身在标准的其他地方被明确禁止 - 我不知道。但也许它仅被这条规则暗示。
标签: c++ namespaces extern