为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
倚天杖 2019-09-03 16:18:28
在C ++中,在没有范围的情况下使用范围解析运算符的目的是什么?例如:::foo();
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

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


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


查看完整回答
反对 回复 2019-09-03
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

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


void bar() {};

class foo {

    void bar(int) {};

    void foobar() { bar(); } // won't compile needs ::bar()

    void foobar(int i) { bar(i); } // ok

}


查看完整回答
反对 回复 2019-09-03
?
慕沐林林

TA贡献2016条经验 获得超9个赞

在全局命名空间中查找以范围解析运算符(::)开头的名称。我们可以通过查看草案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,这是最早的标准草案。


查看完整回答
反对 回复 2019-09-03
  • 3 回答
  • 0 关注
  • 497 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信