如果静态成员函数有返回值,为什么只能在全局范围内调用它们?

All*_*sch 5 c++ static member-functions

我发现了一个奇怪的事情:类/结构的静态成员函数不能称为全局范围,除非它们有返回值。

这个程序不编译:

struct test
{
  static void dostuff()
  {
      std::cout << "dostuff was called." << std::endl;
  }
};

test::dostuff();

int main()
{  
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 GCC v4.8.3 下为我们提供以下内容:

main.cpp:12:16: error: expected constructor, destructor, or type conversion before ';' token
test::dostuff();
               ^
Run Code Online (Sandbox Code Playgroud)

但是,通过向dostuff()全局变量添加返回值并将其分配给全局变量,程序将按预期编译和工作:

struct test
{
  static int dostuff()
  {
      std::cout << "dostuff was called." << std::endl;
      return 0;
  }
};

int i = test::dostuff();

int main()
{
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这产生了预期的输出:

dostuff was called.
Run Code Online (Sandbox Code Playgroud)

谁能向我解释为什么会这样,以及是否有不涉及创建全局变量的解决方法?

Bar*_*rry 4

您不能在全局范围内调用函数,因为,来自 [basic.link]

程序由一个或多个链接在一起的翻译单元(第 2 条组成。翻译单元由一系列声明组成。

test::dostuff();不是一个声明 - 所以你不能将它作为独立的函数调用(事实上它是一个静态成员函数是无关紧要的 - 可以是一个自由函数,在全局对象上调用的非静态成员函数等)。另一方面,int i = test::dostuff(); 全局范围内i类型变量的声明。int这就是为什么它是被允许的。请注意,相关的不是具有返回值的事实dostuff()- 而是您正在声明具有该返回值的变量的事实。