5

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

4

1 回答 1

5

为什么会触发警告?

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

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

如何改进我的代码?

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

于 2012-07-13T15:39:46.940 回答