【问题标题】:scope resolution operator without a scope没有范围的范围解析运算符
【发布时间】:2010-09-09 15:59:54
【问题描述】:

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

::foo();

【问题讨论】:

    标签: c++


    【解决方案1】:

    表示全局范围。当您在同一范围内有冲突的函数或变量并且需要使用全局运算符时,您可能需要使用此运算符。你可能有类似的东西:

    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】:

    在全局命名空间中查找以 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 非常相似,这是最早的可用标准草案。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        当您在本地范围内已经有一个名为 foo() 的函数但您需要在全局范围内访问该函数时。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            指的是全局作用域

            【讨论】:

              猜你喜欢
              • 2012-04-20
              • 1970-01-01
              • 2015-12-18
              • 2014-10-05
              • 1970-01-01
              • 2018-04-24
              • 1970-01-01
              • 2017-04-07
              • 2013-06-13
              相关资源
              最近更新 更多