专家快速介绍:C++11 允许声明未命名的命名空间inline
。这对我来说似乎是多余的;在未命名命名空间中声明的内容已经被使用,就像它们在封闭命名空间中声明一样。
所以我的问题是:这是什么意思
inline namespace /*anonymous*/ {
// stuff
}
它与传统的有何不同
namespace /*anonymous*/ {
// stuff
}
我们从 C++98 中了解并喜爱的是什么?谁能举一个不同行为的例子inline
用来?
EDIT:只是为了澄清,因为这个问题已被标记为重复:我不是在问named一般而言,内联命名空间。我了解那里的用例,并且我认为它们很棒。我特别想问声明一个是什么意思unnamed命名空间为inline
。由于未命名的命名空间必然始终是 TU 本地的,因此符号版本控制原理似乎不适用,所以我很好奇添加什么inline
实际上does.
顺便说一句,关于未命名命名空间的标准 [7.3.1.1] 说:
inline
当且仅当它出现在未命名命名空间定义
但这在我的非语言律师眼中似乎是同义反复——“它出现在定义中当且仅当它出现在定义中”!对于奖励积分,任何人都可以解释一下这段标准话实际上在说什么吗?
EDIT:Cubbi 在评论中获得了加分:
标准是这样说的未命名命名空间定义表现得好像它被替换为X where inline
出现在X当且仅当它出现在未命名命名空间定义
我不知道回答你自己的问题是否已经完成,但经过一番尝试后我的好奇心得到了满足,所以我不妨分享一下。
内联命名空间的定义不仅包括将名称提升到封闭命名空间(对于未命名命名空间无论如何都会发生这种情况),而且还允许在内联命名空间内定义的模板在其外部进行专门化。事实证明这也适用于未命名的命名空间:
inline // comment this out to change behaviour
namespace {
template <typename T> struct A {};
}
template <> struct A<int> {};
如果没有inline
,g++ 抱怨尝试从不同的命名空间专门化模板(尽管 Clang 没有)。和inline
,它编译得很好。对于这两个编译器,专业化中定义的任何内容仍然被标记为具有内部联系(根据nm
),就好像它在未命名的命名空间内一样,但我想这是可以预料的。我真的想不出为什么这会有用,但我们就这样吧。
可以说更有用的效果来自于以下方面的变化参数相关的查找对于内联命名空间,这也会影响未命名的内联命名空间。考虑以下情况:
namespace NS {
// Pretend this is defined in some header file
template <typename T>
void func(const T&) {}
// Some type definition private to this TU
inline namespace {
struct A {};
}
} // end namespace NS
int main()
{
NS::A a;
func(a);
}
Without inline
,ADL失败,我们必须显式地写NS::func(a)
。当然,如果我们在顶层定义未命名的命名空间(通常会如此),那么无论它是否内联,我们都不会获得 ADL,但仍然......
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)