理解匿名函子和lambda

时间:2015-03-13 17:44:49

标签: c++ lambda

请考虑以下代码:

#include <algorithm> 
#include <cstdlib> 
#include <iostream> 
#include <vector>

int main() 
{
    std::vector<int> srcVec; 
    for (int val = 0; val < 10; val++)
    { 
        srcVec.push_back(val); 
    }

    std::for_each(srcVec.begin(), srcVec.end(), [](int a){ std::cout << a << std::endl; }); 
}

DEMO

我认为

Function类型
template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);

应该重载operator ()。但是N4296::5.1.2/3 [expr.prim.lambda]并不需要。{/ p>

  

闭包类型在最小的块范围,类范围中声明,   或包含相应lambda表达式的命名空间作用域。   实现可以定义闭包类型与不同的类型   如下所述,只要这不会改变可观察的行为   该计划除了改变:

     

(3.1) - 闭包类型的大小和/或对齐,

     

(3.2) - 封闭类型是否可以轻易复制(第9条),

     

(3.3) - 闭包类型是否为标准布局类(Clause   9),或

     

(3.4) - 闭包类型是否为POD类(第9条)。

没有任何关于类型应该重载operator ()的说法。那为什么要这样呢?

1 个答案:

答案 0 :(得分:3)

5段(强调我的)中涵盖了这一点:

  

非泛型lambda表达式的闭包类型具有公共内联函数调用运算符(13.5.4)   其参数和返回类型由lambda-expression的parameter-declaration-clause描述   和trailing-return-type分别。对于通用lambda,闭包类型具有公共内联函数调用   运算符成员模板(14.5.2),其template-parameter-list由一个发明的类型模板参数组成   对于lambda的parameter-declaration-clause中每次出现auto,按出现的顺序排列。   如果相应的参数声明声明,则本发明的类型template-parameter是参数包   功能参数包(8.3.5)。函数调用的返回类型和函数参数   operator模板派生自lambda-expression的trailing-return-type和parameter-declarationclause   通过用parameter替换参数声明子句的decl-specifiers中每次出现的auto   相应发明的模板参数的名称

我们可以在13.5.4中看到:

  

operator()应该是一个非静态成员函数,具有任意数量的参数[...]