关于-总回报的目的/行为的混淆
Confusion in regards to purpose/behavior of -Waggregate-return?
在查看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++。但我无法用任何数据来证实这一点。
- 一个关于在C++中重载布尔运算符的问题
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 关于std::move的使用,是否有编译警告
- 关于简单C++函数(is_palindrome)的逻辑的问题
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 关于C++中具有多重继承"this"指针的说明
- 关于 c++ 函数中指针赋值的简单问题
- 关于 std::min, std::max 中的比较运算符的混淆
- 这是关于成员访问规则的正确摘要吗
- C++ 关于指针取消引用的技术问题
- std::is_trivially_copyable_v 关于虚拟功能
- 关于指向指针数组的指针
- 关于复制构造函数的一个棘手问题
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 关于类的 Python 文档 - 对C++的引用不正确
- 关于 C++ 中的函数类型定义
- 关于条件块的问题与&&运算符有关
- 关于如何使用指向主窗口的指针的 QT 问题
- 关于-总回报的目的/行为的混淆