【问题标题】:Does ::myFunction() belongs to global namespace?::myFunction() 是否属于全局命名空间?
【发布时间】:2016-12-01 21:49:18
【问题描述】:
我知道在 C++ 中,我们使用 :: 来限定变量或函数的命名空间,例如 myNamespace::a。但我注意到一些用法,如::myFunction()。是否表示该函数属于全局命名空间?
【问题讨论】:
标签:
c++
function
scope
namespaces
【解决方案1】:
如果代码编译,那么是的,::myFunction() 正在引用 myFunction 的全局声明。
这在局部定义遮蔽全局定义时最常用:
namespace local {
int myFunction() {}; // local namespace definition
};
int myFunction() {}; // global definition.
using namespace local;
int main() {
// myFunction(); // ambiguous two definitions of myFunction in current scope.
local::myFunction(); // uses local::myFunction();
::myFunction(); // uses global myfunction();
【解决方案2】:
是的,这意味着它后面的变量、类型或函数必须在全局命名空间中可用。
例如,当某些东西被本地定义遮蔽时,可以使用它:
struct S {
int i;
};
void f() {
struct S {
double d;
};
S a;
::S b;
static_assert(sizeof(a) != sizeof(b), "should be different types");
}
【讨论】:
-
查看type_traits 和decltype 以绕过具有相同大小的类型。例如:static_assert(std::is_same<decltype(a),decltype(b)>::value, "should be different types");