Kam*_*Kam 9 c++ naming namespaces scope-resolution name-lookup
如果C++中的名称不是完全限定的,例如std::cout,它可能会导致无意的错误,例如https://en.cppreference.com/w/cpp/language/qualified_lookup中提到的.但正如我所注意到的那样,使用名称::std空间的完全限定名称eq ::std::cout是非常罕见的.
是否有任何理由::std不使用名称空间的完全限定名称?
那么为自己创建的命名空间使用完全限定名称呢?这是好主意吗?
Chr*_*phe 11
你是完全正确的,在某种意义上说,yyyy::xxx如果有一个命名空间yyyy,并且同一个类yyyy在同一范围内都可见,那么它可能是不明确的.在这种情况下,只有完整的资格::yyyy::xxx才能解决歧义.您的链接示例非常清楚:
// from cppreference.com
#include <iostream>
int main() {
struct std{};
std::cout << "fail\n"; // Error: unqualified lookup for 'std' finds the struct
::std::cout << "ok\n"; // OK: ::std finds the namespace std
}
Run Code Online (Sandbox Code Playgroud)
但实际上,std在顶级创建冲突很困难,因为标准库中的大多数包含都会使其失败:
#include <iostream>
struct std { // OUCH: error: ‘struct std’ redeclared as different kind of symbol
int hello;
};
Run Code Online (Sandbox Code Playgroud)
这意味着要创建冲突,您需要定义本地类或using在另一个命名空间中引入子句.此外,没有人会(敢于)打电话给班级std.
最后,在实践中,::yyyy::xxx阅读不太方便.这一切都解释了为什么你不经常发现它.
问题不std在于众所周知,而在于您自己的命名空间和第三方库.在这种情况下,命名空间别名将是:::yyyy消除歧义的更好选择:
namespace foo {
void printf() { }
}
int main() {
foo::printf(); // ok, namespace is chose because no ambiguity
struct foo {/*...*/ }; // creates ambiguity
//foo::printf(); // error because struct foo is chosen by name lookup
::foo::printf(); // ok, but not if you decide to move the code to be nested in another namespace
namespace mylib = foo ; // or ::foo (see discussion below)
mylib::printf(); // full flexibility :-)
}
Run Code Online (Sandbox Code Playgroud)
它的优点是灵活性更高.例如,假设您将代码移动到一个封闭的命名空间中.使用命名空间别名,您的代码可以继续按原样工作(在最坏的情况下,在别名定义中进行微调).使用全局范围解析,您必须更改::foo将使用全局命名空间的所有语句.