声明嵌套命名空间`std`是合法的C++吗?

Mar*_* Ba 5 c++ namespaces language-lawyer

std命名空间是C++特殊,所以......

这是合法的C++吗?

// at global scope
namespace mine {
  namespace std {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我称之为疯狂,但允许吗?

可以理解标准的参考(或非参考).

Mar*_*k B 7

reserved names标准17.4.3.1(及其子段落)中,我找不到任何禁止std用作嵌套命名空间名称的内容.它不是一个宏,它不在全局命名空间中,它似乎不符合任何禁止它的"外部链接标准".

它似乎是合法的(尽管你注意到这是非常不可取的).


T.C*_*.C. 5

标准std中使命名空间“特殊”的规则是 (§17.6.4.2.1 [namespace.std]/p1):

如果 C++ 程序向命名空间std或命名空间内的命名空间 添加声明或定义,则它的行为是未定义的,std除非另有说明。

这仅适用于顶级命名空间。

  • 那就是说你不能用现有的命名空间 `std` 添加任何东西。它没有直接解决在另一个命名空间中添加名为 `std` 的命名空间的问题——除非您的意思是它仅适用于顶级命名空间这一事实意味着在其他地方创建 `std` 是合法的。 (3认同)