标准不允许这样的代码:
namespace Hello::World {
//Things that are in namespace Hello::World
}
而是需要
namespace Hello { namespace World {
//Things that are in namespace Hello::World
}}
理由是什么?这当时根本没有想到,还是有一个特定的原因不包括在内?
似乎第一个语法更直接地表达了应该在哪个命名空间中,因为声明模仿了以后代码中命名空间的实际用法。如果你不幸使用“哑”括号计算缩进工具,它也会减少缩进。
答案 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
答案 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 {
}
你会事先声明这个吗?