为什么for_each + lambda触发-Waggregate-return警告?

时间:2012-07-13 15:02:24

标签: c++ c++11

使用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。为什么会触发警告?我错过了什么?如何改进我的代码?

1 个答案:

答案 0 :(得分:3)

  

为什么会触发警告?

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

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

  

如何改进我的代码?

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