非内联命名空间不能作为内联重新打开

Posted

技术标签:

【中文标题】非内联命名空间不能作为内联重新打开【英文标题】:non-inline namespace cannot be reopened as inline 【发布时间】:2020-09-29 12:13:01 【问题描述】:

我在理解编译器的抱怨时遇到了问题:

namespace



inline namespace


gcc 说

必须在初始定义时指定内联命名空间

MSVC 会说出标题中的内容。

我的混乱来自我的期望,即两个后续的匿名命名空间应该被视为一个不相关的新空间的新声明,但编译器抱怨它们以某种方式链接,就像它试图用第二个扩展第一个.

https://godbolt.org/z/rwAYLg

【问题讨论】:

在此提交中patchwork.ozlabs.org/project/gcc/patch/…Nathan Sidwell 删除了重新打开匿名命名空间的概念。听起来不错,但他也造成了我遇到的错误。不检查new_ns idk 听起来有点错误 【参考方案1】:

翻译单元中的每个匿名命名空间都是同一个命名空间。

为:

namespace

  struct F ;


namespace

  struct G ;

编译器有效地生成如下内容:

namespace __mytranslation_unit_anonymous_namespace

  struct F ;


namespace __mytranslation_unit_anonymous_namespace

  struct G ;

FG 都在同一个命名空间中。如果您将代码复制到新的翻译单元,编译器将生成一个新的命名空间名称,例如__mytranslation_unit2_anonymous_namespace.

【讨论】:

令人惊讶。后来你的意思是:“如果你复制到一个新的单位”? @v.oddou 对不起,是的 我在标准的 10.3.1.1 where inline appears if and only if it appears in the unnamed-namespace-definition and all occurrences of unique in a translation unit are replaced by the same identifier, and this identifier differs from all other identifiers in the translation unit. The optional attribute-specifier-seq in the unnamed-namespace-definition appertains to unique 中发现了这个,无法破译。 @v.oddou - 下面的段落中有一个例子。即使对于namespace A namespace - 标识符仍然是相同的。所以你会得到A::__mytranslation_unit1_anonymous_namespace @StoryTeller-UnslanderMonica 是的,这个例子很清楚,但没有理由说明为什么所有匿名命名空间(同一级别)都由相同的 ID 标识。

以上是关于非内联命名空间不能作为内联重新打开的主要内容,如果未能解决你的问题,请参考以下文章

为啥内联未命名的命名空间?

C++ Primer 5th笔记(chap 18 大型程序工具)内联命名空间 (inline namespace)

封闭命名空间内联时的嵌套命名空间定义

内联命名空间中对命名空间的不明确引用

当存在内联命名空间时,如何显式引用封闭的命名空间?

使用内联命名空间的 API 版本控制