【发布时间】:2010-09-09 15:59:54
【问题描述】:
在 C++ 中,在没有作用域的情况下使用作用域解析运算符的目的是什么?例如:
::foo();
【问题讨论】:
标签: c++
在 C++ 中,在没有作用域的情况下使用作用域解析运算符的目的是什么?例如:
::foo();
【问题讨论】:
标签: c++
表示全局范围。当您在同一范围内有冲突的函数或变量并且需要使用全局运算符时,您可能需要使用此运算符。你可能有类似的东西:
void bar(); // this is a global function
class foo {
void some_func() { ::bar(); } // this function is calling the global bar() and not the class version
void bar(); // this is a class member
};
如果您需要从类成员函数中调用全局 bar() 函数,您应该使用 ::bar() 来获取该函数的全局版本。
【讨论】:
在全局命名空间中查找以 scope resolution operator (::) 开头的名称。我们可以通过查看draft C++ standard 部分3.4.3 限定名称查找 段落4 看到这一点(强调我的):
以一元作用域运算符 :: (5.1) 为前缀的名称在全局作用域中查找,在使用它的翻译单元中。该名称应在全局命名空间范围内声明,或者应是由于使用指令(3.4.3.2)而在全局范围内可见的名称。 :: 的使用 允许引用全局名称,即使其标识符已被隐藏 (3.3.10)。
按照标准规定,这允许我们使用来自全局命名空间 that would otherwise be hidden 的名称,链接文档中的示例如下:
int count = 0;
int main(void) {
int count = 0;
::count = 1; // set global count to 1
count = 2; // set local count to 2
return 0;
}
措辞与N1804 非常相似,这是最早的可用标准草案。
【讨论】:
您还应该注意,名称解析发生在重载解析之前。因此,如果在您当前的作用域中有同名的东西,那么它将停止寻找其他名称并尝试使用它们。
void bar() {};
class foo {
void bar(int) {};
void foobar() { bar(); } // won't compile needs ::bar()
void foobar(int i) { bar(i); } // ok
}
【讨论】:
当您在本地范围内已经有一个名为 foo() 的函数但您需要在全局范围内访问该函数时。
【讨论】:
我的 c++ 生锈了,但我相信如果您在本地范围内声明了一个函数,例如 foo() 和一个在全局范围内的函数,则 foo() 指的是本地函数。 ::foo() 将引用全局变量。
【讨论】:
指的是全局作用域
【讨论】: