是否有特定原因在C++中不允许嵌套的命名空间声明?

Bil*_*eal 25 c++ namespaces language-design rationale

该标准不允许这样的代码:

namespace Hello::World {

//Things that are in namespace Hello::World

}
Run Code Online (Sandbox Code Playgroud)

而是要求

namespace Hello { namespace World {

//Things that are in namespace Hello::World

}}
Run Code Online (Sandbox Code Playgroud)

理由是什么?这当时根本没有想到,还是有一个特定的原因不包括在内?

似乎第一个语法更直接地表达了应该在哪个命名空间中,因为声明模仿了以后代码中命名空间的实际使用.如果你不幸使用"哑"括号计算缩进工具,它也会减少缩进.

Jam*_*lis 23

原因很可能是"因为这就是语言的演变方式."

至少有一个提议(2003年的"嵌套命名空间定义提案")允许嵌套命名空间定义,但未选择包含在C++ 0x中.

  • 指向提案的+1 - 我不知道. (3认同)

Far*_*way 14

嵌套命名空间定义是C++ 17工作草案的一部分.
该提议中提到了此主题,作为此功能的一个示例,程序员需要原始n4026 更新版本:n4230.

最新草案:n4567(第7.3.1段第10项)

7.3.1命名空间定义
...
10 带有封闭命名空间指定符E,标识符I和命名空间主体B的嵌套命名空间定义等效于namespace E { namespace I { B } }

示例:

namespace A::B::C {
  int i;
}    The above has the same effect as:

namespace A {
  namespace B {
    namespace C {
      int i;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

编译器支持

版本6开始的 GCC 启用使用-std=c++1z
Visual C++自2015年更新3启用使用/std:c++latest
Clang从版本3.6启用使用-std=c++1z


Pav*_*aev 12

我认为你宁愿希望它是这样的,因为namespace X::Y它应该等同于"命名空间X {名称空间Y`.它在表面上听起来很好,但考虑一个极端情况:

namespace Hello {
   namespace {
      namespace World {}
   }
}

// Does this refer to an existing namespace? Or does it define a new one?
namespace Hello::World {}
Run Code Online (Sandbox Code Playgroud)

  • 这将是一个不同的命名空间.`namespace Hello :: World {}`只是`namespace Hello {namespace World {}}`的简写,这是该语言已经允许的. (6认同)
  • +1指出我什至不知道是合法的事情:) (2认同)
  • @Omnifarious:我想你可以使用`namespace Hello :::: World {}`,但是我怀疑有人会支持:-P (2认同)
  • @Potato:这是我喜欢C++的一个很好的例子.:-O (2认同)