qualified::toplevel_namespace和unqualified toplevel_namespace
Is there any difference between qualified ::toplevel_namespace and unqualified toplevel_namespace?
一般来说,::any_name
和any_name
的区别应该很明显。如果前面有::
,则该名称始终只在全局命名空间中查找。
我想知道,然而,是否有一个技术(*)差异,给定一个命名空间,我已经知道是顶层(即直接低于全局命名空间),其中我知道没有第二个(嵌套的)命名空间(或任何名称)相同的名称。
例如,使用::std::string
和std::string
有什么区别吗?
(*)不考虑可读性、风格和维护问题。
"例如,使用::std::string和使用std::string有什么区别吗?"
想想这种奇怪的情况
LegacyString.hpp
namespace Legacy {
namespace std {
class string {
// ...
};
}
}
#include <string>
#include "LegacyString.hpp"
using namespace Legacy;
在这种情况下,如果你在下面的代码中说::std::string
或只是std::string
,肯定会有区别。
是的,正如你的另一个问题的公认答案所述,命名任何结构都是完全合法的,无论是namespace
, class
, struct
, typedef
等。 std
。
关于你的问题编辑:
"并且我知道没有第二个(嵌套的)名称空间(或任何名称)相同的名称。"
如果你知道这种情况,这两种形式当然是等价的。正如您所提到的,名称空间的解析最终在全局级别结束,并且在没有前缀::
的情况下将正确地解析它。
IMHO通常我们依赖,至少没有人是那么愚蠢,命名任何结构std
实际上。但是引用爱因斯坦的话:
"有两样东西是无限的:宇宙和人类的愚蠢;我对宇宙也不确定。"
相关文章:
- "using namespace std;"在C++的作用是什么?
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 为什么我需要做'using namespace std'而不是"使用 std::cout"?
- 'using namespace'实现细节的便捷方法(仅标头库)?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- C++ "using tcp=x"到"namespace tcp=x"有什么区别
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- 以前的'namespace reference { }'声明
- "using namespace"子句在什么范围内有效?
- C++ - 尝试在类中使用全局时'Not a class or namespace'
- 如何找到"using namespace std"的违规用法?
- 声明"使用命名空间 C;"对于证明 [namespace.udir]/3 中的示例中显示的结果至关重
- 在实现文件中,我们应该更喜欢"using namespace"指令还是将实现包装在命名空间 { } 中?
- 如何根据对象名称将'using namespace'添加到类定义中?
- 修复第三方代码:"error: ‘enable_if’ in namespace ‘std’ does not name a template type"
- 什么原因导致我的"‘FatalError’ in namespace ‘Foam’ does not name a type"错误?
- 没有任何 #include "using namespace std;"?
- 错误:在 MacOS 上"no member named 'uint8_t' in the global namespace"
- 用于定义全局函数"using namespace"
- VS 代码C++扩展给出错误"namespace has no member function"