gpt4 book ai didi

c++ - 为什么静态成员函数只有在有返回值的情况下才能在全局范围内调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:35:49 25 4
gpt4 key购买 nike

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

这个程序不编译:

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

test::dostuff();

int main()
{
return 0;
}

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

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;
}

这会产生预期的输出:

dostuff was called.

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

最佳答案

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

A program consists of one or more translation units (Clause 2) linked together. A translation unit consists of a sequence of declarations.

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

关于c++ - 为什么静态成员函数只有在有返回值的情况下才能在全局范围内调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30015149/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com