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

标签 c++ c++11

当尝试使用 gcc 和 -Waggregate-return 标记警告的以下示例时:function call has aggregate value triggers:

struct Element {
// ... stuff ...
}

Container<Element> elements(10);
for_each(begin(elements),end(elements),[](Element& e){

// ... modify elements ...

});

据我所知,-Waggregate-return 标记“如果定义或调用任何返回结构或 union 的函数时发出警告”,因为如果我理解正确的话,您可能通过返回足够大的对象来溢出堆栈。

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

最佳答案

Why does it trigger the warning?

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

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

How can I improve my code?

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

关于c++ - 为什么 for_each + lambda 会触发 -Waggregate-return 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11473099/

相关文章:

c++ - 此示例的最佳字符串哈希函数

c++ - 替代 rand() 以避免竞争条件?

c++ - vftable 是按派生类的对象编译的吗?

c++ - Windows 上的 clang 和 <iostream>

c++ - 如何从 C++ 中的其他格式文件创建 GIF 文件

c++ - decltype 在不生成代码的模板方法上抛出错误

c++ - 如何将来自用户定义文字的可变字符模板参数转换回数字类型?

C++ 方法线程

C++0x 线程没有加速

C++ cout 腐败