26

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

namespace Hello::World {

//Things that are in namespace Hello::World

}

而是需要

namespace Hello { namespace World {

//Things that are in namespace Hello::World

}}

理由是什么?这是当时根本没有想到的,还是没有包括在内的具体原因?

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

4

5 回答 5

23

原因很可能是“因为这就是语言的演变方式”。

至少有一项提案(“2003 年的“嵌套命名空间定义提案”)允许嵌套命名空间定义,但它没有被选中包含在 C++0x 中。

于 2010-08-30T19:25:43.013 回答
16

嵌套命名空间定义是 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;
    }
  }
}

编译器支持

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

于 2016-09-25T18:40:23.640 回答
13

我想你宁愿希望它是这样的,给定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 {}
于 2010-08-30T19:35:08.337 回答
2

正如我在那个“可能重复的”线程中所说,在 C++ 中,限定名称保留用于引用先前声明的实体。这适用于限定名称的“来源”:类和命名空间。

于 2010-08-30T19:28:26.077 回答
0

我认为这是一个设计选择。

第一种语法看起来不错。我也想拥有它。但是,第二个更结构化。您不会以这种方式创建嵌套命名空间:

Hello::World::Everyone::Great {

}

你会事先声明吗?

于 2010-08-30T19:52:22.117 回答