【问题标题】:What does the syntax ::function_name mean in c++?语法 ::function_name 在 C++ 中是什么意思?
【发布时间】:2017-12-22 04:08:18
【问题描述】:

在名为::foo() 的函数中,我不明白语法的用途。 如果是foo::count_all(),那么我知道count_all 是类或命名空间foo 的函数。

::foo() 的情况下,:: 引用的是什么?

【问题讨论】:

标签: c++ visual-c++


【解决方案1】:

:: 运算符正在调用namespaceclass。在您的情况下,它正在调用全局命名空间,这是不在命名命名空间中的所有内容。

下面的例子说明了为什么命名空间很重要。如果您只是拨打foo(),您的电话将无法解决,因为有 2 个foos。您需要使用::foo() 解决全局问题。

namespace Hidden {
    int foo();
}

int foo();

using namespace Hidden; // This makes calls to just foo ambiguous.

int main() {
    ::foo(); // Call to the global foo
    hidden::foo(); // Call to the foo in namespace hidden 
}

【讨论】:

  • 不错。这是一个很好的例子。我只是添加了一点,以便更清楚地说明您需要它的原因。
  • @FantasticMrFox 感谢您对我的回答的投入,非常感谢。
【解决方案2】:

:: 前面没有任何内容,表示全局命名空间。例如:

int foo(); // A global function declaration

int main() {
   ::foo(); // Calling foo from the global namespace.
   ...

【讨论】:

    【解决方案3】:

    这是对全局范围内的函数 foo() 的函数调用,而不是声明。函数名前面的 :: 表示您明确要调用全局函数 foo(),而不是从某个更窄的范围内调用其他版本的 foo()。

    例如

    void foo()
    {
      printf("global foo\n");
    }
    
    namespace bar
    {
      void foo()
      {
        printf("bar::foo\n");
      }
    
      void test()
      {
        foo();
        ::foo();
      }
    }
    

    对 bar::test() 的调用将打印出来:

    bar::foo
    global foo
    

    【讨论】:

      【解决方案4】:

      通过指定 :: 您告诉系统查看全局命名空间。另见这篇文章

      https://stackoverflow.com/a/6790112/249492

      以下是@CharlesBailey 的示例,我们位于“nest”命名空间内。您对“x”的访问可以更改为上层命名空间,具体取决于您是否指定使用全局命名空间。

      namespace layer {
          namespace module {
              int x;
          }
      }
      
      namespace nest {
          namespace layer {
              namespace module {
                  int x;
              }
          }
          using namespace /*::*/layer::module;
      }
      

      【讨论】:

      • 不要只分享链接。在答案中添加相关信息。
      • @FantasticMrFox,感谢您的反馈。当时的想法是减少重复响应。我更新了我的答案,提供了一个例子。
      • @FantasticMrFox,由于答案已根据要求进行了更新,您能否更新您的反对票?
      猜你喜欢
      • 1970-01-01
      • 2018-05-12
      • 2011-08-01
      • 2016-11-12
      • 2017-04-13
      • 2010-09-22
      • 1970-01-01
      • 2013-11-02
      • 2018-05-22
      相关资源
      最近更新 更多