关于-总回报的目的/行为的混淆

Confusion in regards to purpose/behavior of -Waggregate-return?

本文关键字:回报 关于      更新时间:2023-10-16

在查看GCC的警告选项时,我看到了-Waggregate-return

-Waggregate-return
如果定义或调用任何返回结构或联合的函数,则发出警告。(在可以返回数组的语言中,这也会引发警告。)


提示警告的小示例:

class foo{};
foo f(void){return foo{};}
int main(){}

$ g++ -std=c++0x -Waggregate-return - 0 main.cpp
main.cpp: In function ' foo f() ':
main.cpp:2:5:警告:函数返回一个聚合[-Waggregate-return]


另一个不引起警告的小示例:

#include <string>
std::string f(void){return "test";}
int main(){}

使用-Waggregate-return的好处是什么?
为什么有人想被警告这个?
另外,std::string不是一个类吗?-为什么在第二个例子中没有警告我"返回的聚合"?

在@AlokSave的评论之后,这里是稍后编辑的答案:

这个编译器标志有两种可能的解释。由于关于它的文献很少,它的原意是什么有点不清楚,但主要有两种可能的解释:

1)警告用户关于返回聚合对象,使他意识到如果返回聚合对象(在堆栈上分配),堆栈可能溢出。

2)显然,一些旧的C编译器不支持返回聚合(你必须返回一个指针)。

这两个中哪一个是最好的,我很难判断。但是,有关此标志的更多相关信息可以在以下链接中找到:

http://bytes.com/topic/c/answers/644271-aggregate-return-warnings

https://lists.gnu.org/archive/html/bug-gnulib/2012-09/msg00006.html

引用后一个链接:

在我熟悉的GNU应用程序中(Emacs, coretils,…)我们只需禁用-Waggregate-return。这完全是不合时宜的警告,因为它的动机是支持向后兼容的C编译器不允许返回结构。这些编译器早就死了,不再有实际意义了。

聚合在C和c++标准中定义。C版本说(C99 6.2.5 Types/20-21):

结构类型描述了一组按顺序分配的非空成员对象(在某些情况下,是不完整的数组),每个数组都有一个可选的指定的名称和可能不同的类型。

[…]算术类型和指针类型统称为标量类型。数组和结构类型统称为聚合类型。

c++版本说(N3485 8.5.1 [dcl.init.aggr]/1):

聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有非静态数据成员的大括号或等于初始化式(9.2),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),没有虚函数(10.3)。

第二个例子(std::string)不会触发警告,因为std::string有一个用户提供的构造函数;并且具有私有数据成员。

我怀疑这个警告存在,因为在C中返回聚合被认为是糟糕的风格;在该语言中,首选传递out指针。我认为它不太适用于c++。但我无法用任何数据来证实这一点。