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中.
Far*_*way 14
嵌套命名空间定义是C++ 17工作草案的一部分.
该提议中提到了此主题,作为此功能的一个示例,程序员需要原始n4026 更新版本:n4230.
最新草案:n4567(第7.3.1段第10项)
7.3.1命名空间定义
...
10 带有封闭命名空间指定符E,标识符I和命名空间主体B的嵌套命名空间定义等效于namespace E { namespace I { B } }示例:
Run Code Online (Sandbox Code Playgroud)namespace A::B::C { int i; } The above has the same effect as: namespace A { namespace B { namespace C { int i; } } }
从版本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)
| 归档时间: |
|
| 查看次数: |
5596 次 |
| 最近记录: |