对于专家来说很简单:C++11允许声明无名命名空间为inline
。这对我来说似乎是多余的;在无名命名空间中声明的东西已经被视为在包围命名空间中声明。
那么我的问题是:这意味着什么?
inline namespace /*anonymous*/ {
// stuff
}
它与传统方式有何不同
namespace /*anonymous*/ {
// stuff
}
我们从C++98中了解并喜爱的特性,是否有人可以举出使用inline
时不同行为的示例?
编辑:仅作澄清,因为这个问题已被标记为重复:我不是在问一般命名的内联命名空间。我理解它们的用例,而且我认为它们很棒。我具体地询问声明一个未命名命名空间为inline
是什么意思。由于未命名命名空间必须始终局部于TU,因此符号版本控制似乎并不适用,因此我想知道添加inline
实际上是做了什么。
此外,关于未命名命名空间,标准[7.3.1.1]说:
inline
只有在unnamed-namespace-definition 中出现时才会出现
但对于我这个非语言律师来说,这似乎是一个同义反复的说法——“它只有在定义中出现时才会出现在定义中”!额外加分的话题,有谁能解释一下这个标准术语到底在说什么?
编辑: Cubbi 在评论中回答了额外加分的问题:
标准是说,未命名的命名空间定义会像它被X替换一样表现,其中
inline
出现在unnamed-namespace-definition中,当且仅当inline
出现在X中。
inline
出现在X中当且仅当它出现在未命名的命名空间定义中。 - Cubbi