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

gnz*_*lbg 5 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 ...

});
Run Code Online (Sandbox Code Playgroud)

据我所知,-Waggregate-return标志"警告,如果任何返回结构或联合的函数被定义或调用",因为,如果我理解正确,你可能会通过返回一个足够大的对象来溢出堆栈.

然而,for_each返回类型的拉姆达,其类型为void.为什么会触发警告?我错过了什么?我该如何改进我的代码?

Mik*_*our 5

为什么会触发警告?

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

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

我该如何改进我的代码?

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

  • @PierreBdR:这是正确的,但我没有说任何关于“begin(c)”的事情。 (3认同)