Pet*_*man 20
::是范围解析运算符.它总是意味着"在全局命名空间中搜索右边的符号".例如:
namespace testing {
int a = 1;
}
namespace foo {
namespace testing {
int a = 2;
}
int b = ::testing::a; // b has the value 1
int c = testing::a; // c has the value 2
}
Run Code Online (Sandbox Code Playgroud)
这意味着testing所引用的命名空间是全局命名空间之外的命名空间,而不是另一个命名的嵌套命名空间testing.
考虑以下极端情况,可能是糟糕设计的一个例子:
namespace foo
{
struct gizmo{int n_;};
namespace bar
{
namespace foo
{
float f_;
};
};
};
int main()
{
using namespace foo::bar;
::foo::gizmo g;
g.n_;
}
Run Code Online (Sandbox Code Playgroud)
有两个命名空间foo.一个是"全局"命名空间的顶层挂起,另一个嵌套在其中foo::bar.然后我们继续using namespace foo::bar,意味着任何不合格的参考gizmo将会拿起那个foo::bar::foo.如果我们真的想要那个,foo我们可以使用明确的资格来做到这一点:
::foo::gizmo
| 归档时间: |
|
| 查看次数: |
2498 次 |
| 最近记录: |