为什么for_each+lambda触发器-Waggregate返回警告

Why does for_each + lambda trigger -Waggregate-return warning?

本文关键字:-Waggregate 返回 警告 触发器 each+lambda for 为什么      更新时间:2023-10-16

当尝试以下带有gcc和-Waggregate-return标志的示例时,警告:function call has aggregate value触发:

struct Element {
// ... stuff ...
}
Container<Element> elements(10);
for_each(begin(elements),end(elements),[](Element& e){
// ... modify elements ...
});

据我所知,-Waggregate-return标志"如果定义或调用了任何返回结构或并集的函数,就会发出警告",因为如果我理解正确,您可能会通过返回足够大的对象来溢出堆栈。

但是,for_each返回lambda的类型,其类型为void。为什么它会触发警告?我错过了什么?如何改进我的代码?

为什么它会触发警告?

据推测,该警告是由返回类或联合类型的任何内容触发的。Lambdas具有类类型,for_each返回其函数参数,因此将触发警告。

begin(elements)end(elements)返回的迭代器类型也可能触发警告,这取决于Container类型如何实现迭代器。

如何改进我的代码?

我会禁用该警告;它与惯用C++并不真正兼容,因为从函数返回小类对象是非常常见的。例如,它也会由返回一对的std::map::insert()和许多其他标准库函数触发。