我阅读了有关命名空间定义的部分。N3797第7.3.1条说:
内联关键字只能在扩展名称空间定义之前用于该名称空间的原始名称空间定义时才能使用。
考虑以下代码片段:
namespace M
{
int h;
}
inline namespace M
{
int j = 6;
}它编译成功,既使用-std=c++11,也没有该选项。你能解释一下这种行为吗?这是一个g++错误吗?
发布于 2014-06-14 13:49:04
Vour对标准的引用是明确的:这是不允许的。
使用Clang++,我得到了非常清楚的错误消息:
Test0614-1.cpp:17:18: error: non-inline namespace cannot be reopened as inline
inline namespace M
^
Test0614-1.cpp:12:11: note: previous definition is here
namespace M
^因此,在g++中,它确实是一个bug。顺便说一句,这里有报道:bug.cgi?id=53402
编译器接受标准的早期版本的内联命名空间并且至少没有警告这一事实似乎是一个问题。这在2010年已经被报告为bug,应该是修复的:bug.cgi?id=43824。
发布于 2020-06-03 15:39:12
namespace M
{
int h;
}
inline namespace M
{
int j = 6;
}这将导致错误的非内联命名空间不能作为内联命名空间打开。
你必须使用:
inline namespace M
{
int h;
}
inline namespace M
{
int j = 6;
}相反,您应该得到一个警告,即您正在将内联命名空间重新打开为非内联命名空间。
inline namespace M
{
int h;
}
namespace M
{
int j = 6;
}但是从我所能知道的情况来看,它并没有改变任何事情,所以我不知道为什么会存在警告,但是它存在的事实和::inline提出的不一样。
namespace M
{
inline namespace F {
int h;
}
}
namespace M::F {
int k;
}提供相同的警告,当使用:
namespace M::inline F {
int k;
}有趣的是,这是非法的:
inline namespace M
{
inline namespace F {
int h;
}
}
inline namespace M::inline F {
int k;
}您可以使用namespace M::inline F或namespace M::F,但在这两种情况下都会收到一个警告,即您将内联命名空间M作为非内联命名空间打开。
可能::inline的存在只是为了抑制该警告,并使程序员从扩展命名空间中了解到,它是一个内联命名空间,无需使用范围解析操作符就可以访问,而不必检查主名称空间定义,这使代码和意图变得清晰,而且由于大多数内联名称空间用于版本控制,而这些名称空间总是嵌套在全局命名空间范围的非内联命名空间中,因此不需要使用语法inline namespace M::inline F。以前,必须使用namespace M {inline F {int k;}}而不是namespace M::F来明确扩展命名空间块的意图。
https://stackoverflow.com/questions/24219690
复制相似问题