【问题标题】:Prevent hijacking a namespace to an inline namespace防止将命名空间劫持为内联命名空间
【发布时间】:2015-03-25 17:00:45
【问题描述】:

必须将命名空间声明为inline 是第一个,还是可以在任何时候将任何(重新打开的)命名空间声明为inline?

如果是这样,有没有办法阻止某人将命名空间声明为inline(之后)?

#include <iostream>

namespace outer {
//inline
namespace inner {
}}

//inline namespace std {}

namespace outer {
inline
namespace inner {
    void foo() {
        std::cout << "foo" << std::endl;
        //::cout << "foo" << endl;
    }
}}

int main() {
    outer::foo();
}

编辑
似乎 gcc 接受了这一点,因为我首先只在 coliru 上进行了测试,但是 clang rejects it

这是一个错误吗?

【问题讨论】:

    标签: c++ c++11 namespaces


    【解决方案1】:

    7.3.1/7 向我们展示了它必须在第一次声明时内联声明:

    如果可选的初始内联关键字出现在 特定命名空间的命名空间定义,该命名空间是 声明为内联命名空间。 inline 关键字可用于 扩展命名空间定义,仅当它之前使用过 该命名空间的原始命名空间定义。

    【讨论】:

    • 谢谢!我用GCC编译(几个版本),clang报错
    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 2014-10-15
    • 2020-08-07
    • 2017-01-07
    • 2014-03-31
    相关资源
    最近更新 更多