使用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
。为什么会触发警告?我错过了什么?如何改进我的代码?
答案 0 :(得分:3)
为什么会触发警告?
据推测,警告是通过返回类或联合类型的任何内容来触发的。 Lambdas具有类类型,for_each
返回其函数参数,因此将触发警告。
begin(elements)
和end(elements)
返回的迭代器类型也可能触发警告,具体取决于Container
类型实现迭代器的方式。
如何改进我的代码?
我会禁用该警告;它与惯用的C ++并不完全兼容,因为从函数返回小类对象非常常见。它也会被例如std::map::insert()
触发,它返回一对,以及许多其他标准库函数。