【发布时间】:2017-12-22 04:08:18
【问题描述】:
在名为::foo() 的函数中,我不明白语法的用途。
如果是foo::count_all(),那么我知道count_all 是类或命名空间foo 的函数。
在::foo() 的情况下,:: 引用的是什么?
【问题讨论】:
标签: c++ visual-c++
在名为::foo() 的函数中,我不明白语法的用途。
如果是foo::count_all(),那么我知道count_all 是类或命名空间foo 的函数。
在::foo() 的情况下,:: 引用的是什么?
【问题讨论】:
标签: c++ visual-c++
:: 运算符正在调用namespace 或class。在您的情况下,它正在调用全局命名空间,这是不在命名命名空间中的所有内容。
下面的例子说明了为什么命名空间很重要。如果您只是拨打foo(),您的电话将无法解决,因为有 2 个foos。您需要使用::foo() 解决全局问题。
namespace Hidden {
int foo();
}
int foo();
using namespace Hidden; // This makes calls to just foo ambiguous.
int main() {
::foo(); // Call to the global foo
hidden::foo(); // Call to the foo in namespace hidden
}
【讨论】:
:: 前面没有任何内容,表示全局命名空间。例如:
int foo(); // A global function declaration
int main() {
::foo(); // Calling foo from the global namespace.
...
【讨论】:
这是对全局范围内的函数 foo() 的函数调用,而不是声明。函数名前面的 :: 表示您明确要调用全局函数 foo(),而不是从某个更窄的范围内调用其他版本的 foo()。
例如
void foo()
{
printf("global foo\n");
}
namespace bar
{
void foo()
{
printf("bar::foo\n");
}
void test()
{
foo();
::foo();
}
}
对 bar::test() 的调用将打印出来:
bar::foo
global foo
【讨论】:
通过指定 :: 您告诉系统查看全局命名空间。另见这篇文章
https://stackoverflow.com/a/6790112/249492
以下是@CharlesBailey 的示例,我们位于“nest”命名空间内。您对“x”的访问可以更改为上层命名空间,具体取决于您是否指定使用全局命名空间。
namespace layer {
namespace module {
int x;
}
}
namespace nest {
namespace layer {
namespace module {
int x;
}
}
using namespace /*::*/layer::module;
}
【讨论】: