当前位置:  开发笔记 > 编程语言 > 正文

没有范围的范围解析运算符

如何解决《没有范围的范围解析运算符》经验,为你挑选了3个好方法。

在C++中,在没有范围的情况下使用范围解析运算符的目的是什么?例如:

::foo();

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



1> Mark..:

它意味着全球范围.如果在同一范围内存在冲突的函数或变量,并且需要使用全局函数或变量,则可能需要使用此运算符.你可能有类似的东西:

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> Matt Price..:

此外,您应该注意,名称解析在重载解析之前发生.因此,如果当前范围中存在具有相同名称的内容,则它将停止查找其他名称并尝试使用它们.

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



3> Shafik Yaghm..:

在全局命名空间中查找以范围解析运算符(::)开头的名称.我们可以通过查看草案C++标准部分的3.4.3 合格名称查找4段来看到这一点(强调我的):

在全局范围内,在使用它的转换单元中查找以一元范围运算符::(5.1)前缀的名称.该名称应在全局命名空间范围内声明,或者是由于using-directive(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,这是最早的标准草案.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有