在C ++中,不带范围使用范围解析运算符的目的是什么? 例如:

::foo();

===============>>#1 票数:67 已采纳

这意味着全球范围。 如果在同一作用域中有冲突的函数或变量,并且需要使用全局运算符,则可能需要使用此运算符。 您可能会有类似以下内容:

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()来获取函数的全局版本。

===============>>#2 票数:7

还应注意,名称解析发生在重载解析之前。 因此,如果您当前的作用域中存在具有相同名称的名称,那么它将停止寻找其他名称并尝试使用它们。

void bar() {};
class foo {
    void bar(int) {};
    void foobar() { bar(); } // won't compile needs ::bar()
    void foobar(int i) { bar(i); } // ok
}

===============>>#3 票数:6

在全局名称空间中查找以范围解析运算符:: :)开头的名称。 通过查看C ++标准草案3.4.3节“ 合格名称查找”4段可以看到这一点,其中( 强调我的 ):

由一元作用域运算符:::(5.1)前缀的名称是在全局作用域中使用的翻译单位中查找的 该名称应在全局名称空间范围内声明,或者是由于使用指令(3.4.3.2)而在全局范围内可见的名称。 使用:: 允许引用全局名称,即使其标识符已隐藏 (3.3.10)。

按照标准,这允许我们使用全局名称空间中的名称,否则它们将被隐藏 ,链接文档中的示例如下:

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非常相似,后者是最早的标准草案。

===============>>#4 票数:3

如果在本地作用域中已经有一个名为foo()的函数,但是您需要在全局作用域中访问该函数。

===============>>#5 票数:2

我的c ++生锈了,但是我相信,如果您有一个在局部范围内声明的函数,例如foo()和一个在全局范围内声明的函数,则foo()则指的是局部函数。 :: foo()将引用全局变量。

===============>>#6 票数:1

指全球范围

  ask by Landon Kuhn translate from so

未解决问题?本站智能推荐:

1回复

范围解析和此运算符

在我最近采用的(C ++)课程中,老师提到使用->运算符比使用点表示法和手动取消引用指针(例如(*ptr) )要慢一点。 这是真的,如果是这样,为什么? 这也适用于C吗?
2回复

范围解析运算符

我偶然碰巧在我看到的一个源代码中找到了这个。 所以,我在这里给出了一个类似的小例子。 在文件test.h中 : 在test.cpp文件中: 首先,是否有理由以这种方式声明test2 ? 其次,这个代码在g ++ 4.4.3版和更低版本中编译得很好。 C ++标准中有什
4回复

范围解析运算符和const

让我们看下面的代码: 为什么要编译此代码? 仅当XXX是基本类型时,才会出现错误“ XXX之前的预期id表达式”。
1回复

范围解析运算符的评估

这可能是一个愚蠢的问题。 我注意到我们将作用域解析运算符::用于名称空间和静态成员函数。 1) std::printf("foo"); 2) MyClass::foo(); 这是我的问题: 1. C ++编译器如何区分它们? 2. C ++编译器看到作用域解析运算符
2回复

isalnum的范围解析运算符

我正在问这个问题,作为对此问题的后续行动。 上一个问题是在大约三年前提出的,所以我问一个新的问题会更好。 我链接到的问题的症结在于,OP试图运行以下代码行: 一些容器s 。 该行代码无法编译,OP应该执行此操作 可接受的答案表明,在locale和cctype库中存在is
3回复

什么是点运算符和范围解析运算符之间的区别

我只是想知道它们之间的区别。 operator和:: operator?
3回复

死亡钻石和范围解析运算符(C ++)

我有此代码(钻石问题): 我想在Top类中调用print() 。 当我尝试对其进行编译时,出现错误: 'Top' is an ambiguous base of 'Bottom'此行上'Top' is an ambiguous base of 'Bottom' : b.Right:
3回复

范围解析运算符之前/之后的空格

C ++语言中的哪个规则允许范围解析运算符::前后出现空格? 即以下编译没有警告 :
1回复

范围解析运算符(如果存在三个变量)

这个问题已经在这里有了答案: 有没有办法在C ++中访问外部作用域中的局部变量? 4个答案 我刚刚开始学习c ++。 我遇到了作用域解析运算符,并尝试了类似这样的程序 但是如果我想访问main()内部块内的变量i(i = 20 main() 。 我怎么
2回复

范围解析运算符和从属名称

我有以下测试代码 ISO C ++ 03 14.2/4 :说 当成员模板专业化的名称出现之后。 或 - >在postfix-expression中,或在qualified-id中的nested-name-specifier之后,postfix-expression或qu