首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内联命名空间和扩展命名空间

内联命名空间和扩展命名空间
EN

Stack Overflow用户
提问于 2014-06-14 11:59:41
回答 2查看 1.1K关注 0票数 9

我阅读了有关命名空间定义的部分。N3797第7.3.1条说:

内联关键字只能在扩展名称空间定义之前用于该名称空间的原始名称空间定义时才能使用。

考虑以下代码片段:

代码语言:javascript
复制
namespace M
{
    int h;
}

inline namespace M
{
    int j = 6;
}

它编译成功,既使用-std=c++11,也没有该选项。你能解释一下这种行为吗?这是一个g++错误吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-14 13:49:04

Vour对标准的引用是明确的:这是不允许的。

使用Clang++,我得到了非常清楚的错误消息:

代码语言:javascript
复制
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

票数 6
EN

Stack Overflow用户

发布于 2020-06-03 15:39:12

代码语言:javascript
复制
namespace M
{
    int h;
}

inline namespace M
{
    int j = 6;
}

这将导致错误的非内联命名空间不能作为内联命名空间打开。

你必须使用:

代码语言:javascript
复制
inline namespace M
{
    int h;
}

inline namespace M
{
    int j = 6;
}

相反,您应该得到一个警告,即您正在将内联命名空间重新打开为非内联命名空间。

代码语言:javascript
复制
inline namespace M
{
    int h;
}

namespace M
{
    int j = 6;
}

但是从我所能知道的情况来看,它并没有改变任何事情,所以我不知道为什么会存在警告,但是它存在的事实和::inline提出的不一样。

代码语言:javascript
复制
namespace M
{
    inline namespace F {
        int h;
    }
}

namespace M::F {
    int k;
}

提供相同的警告,当使用:

代码语言:javascript
复制
namespace M::inline F {
    int k;
}

有趣的是,这是非法的:

代码语言:javascript
复制
inline namespace M
{
    inline namespace F {
        int h;
    }
}

inline namespace M::inline F {
    int k;
}

您可以使用namespace M::inline Fnamespace M::F,但在这两种情况下都会收到一个警告,即您将内联命名空间M作为非内联命名空间打开。

可能::inline的存在只是为了抑制该警告,并使程序员从扩展命名空间中了解到,它是一个内联命名空间,无需使用范围解析操作符就可以访问,而不必检查主名称空间定义,这使代码和意图变得清晰,而且由于大多数内联名称空间用于版本控制,而这些名称空间总是嵌套在全局命名空间范围的非内联命名空间中,因此不需要使用语法inline namespace M::inline F。以前,必须使用namespace M {inline F {int k;}}而不是namespace M::F来明确扩展命名空间块的意图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24219690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档