请考虑以下代码:
#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; });
}
我认为
的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 ()
的说法。那为什么要这样呢?
答案 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()应该是一个非静态成员函数,具有任意数量的参数[...]