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 下为我们提供以下内容:
Run Code Online (Sandbox Code Playgroud)main.cpp:12:16: error: expected constructor, destructor, or type conversion before ';' token test::dostuff(); ^
但是,通过向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)
这产生了预期的输出:
Run Code Online (Sandbox Code Playgroud)dostuff was called.
谁能向我解释为什么会这样,以及是否有不涉及创建全局变量的解决方法?
您不能在全局范围内调用函数,因为,来自 [basic.link]
程序由一个或多个链接在一起的翻译单元(第 2 条)组成。翻译单元由一系列声明组成。
test::dostuff();不是一个声明 - 所以你不能将它作为独立的函数调用(事实上它是一个静态成员函数是无关紧要的 - 可以是一个自由函数,在全局对象上调用的非静态成员函数等)。另一方面,int i = test::dostuff(); 是全局范围内i类型变量的声明。int这就是为什么它是被允许的。请注意,相关的不是具有返回值的事实dostuff()- 而是您正在声明具有该返回值的变量的事实。