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

时间:2010-08-30 19:15:00

标签: c++ namespaces language-design rationale

标准不允许这样的代码:

namespace Hello::World {

//Things that are in namespace Hello::World

}

而是需要

namespace Hello { namespace World {

//Things that are in namespace Hello::World

}}

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

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

5 个答案:

答案 0 :(得分:23)

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

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

答案 1 :(得分:14)

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

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

  

7.3.1命名空间定义
  ...
  的 10   带有封闭命名空间指定符E,标识符I和命名空间-body 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自version 6启用-std=c++1z后使用 Visual C ++自2015 update 3启用后使用/std:c++latest
version 3.6启用后使用-std=c++1z

启用了Clang

答案 2 :(得分:11)

我认为你宁愿希望它是这样的,给定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 {}

答案 3 :(得分:2)

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

答案 4 :(得分:0)

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

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

Hello::World::Everyone::Great {

}

你会事先声明这个吗?