防止将名称空间劫持到内联名称空间

时间:2015-03-25 17:00:45

标签: c++ c++11 namespaces

必须将名称空间声明为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

这是一个错误吗?

1 个答案:

答案 0 :(得分:2)

7.3.1 / 7告诉我们必须在第一个声明中内联声明:

  

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