Lambda表达式
结构
//原型:
[ 捕获 ] ( 形参 ) { 函数体 }
//例子
auto capture_handler = [this](QWidget* widget, QString name)
{
callbacks_.capture_(parent_window_, widget, name);
};
//调用
QWidget* widget_;
QString name_;
capture_handler(widget_,name_);
说明
-
捕获
若变量满足下列条件,则 lambda 表达式可以不捕获就使用它
若变量满足下列条件,则 lambda 表达式可以不捕获就读取其值
- 该变量具有 const 而非 volatile 的整型或枚举类型,并已用常量表达式初始化,或者
- 该变量为
constexpr
且无 mutable 成员。
-
返回值
省略尾随返回类型:闭包的operator()
的返回类型从return
语句推导,如同对于声明返回类型为 auto 的函数的推导一样。 -
默认捕获
-
&(以引用隐式捕获被使用的自动变量)和
-
=(以复制隐式捕获被使用的自动变量)。
void f(int, const int (&)[2] = {}) {} // #1 void f(const int&, const int (&)[1]) {} // #2 void test() { const int x = 17; auto g0 = [](auto a) { f(x); }; // ok:调用 #1,不捕获 x auto g1 = [=](auto a) { f(x); }; // C++14 中不捕获 x,C++17 中捕获 x // 捕获能被优化掉 auto g2 = [=](auto a) { int selector[sizeof(a) == 1 ? 1 : 2] = {}; f(x, selector); // ok:此为待决表达式,故 x 被捕获 }; auto g3 = [=](auto a) { typeid(a + x); // 捕获 x,不管 a + x 是否为不求值操作数 }; } // C++14 起,lambda 能拥有自身的默认实参 auto func1 = [](int i = 6) { return i + 4; }; std::cout << "func1: " << func1() << '\n'; //10 std::cout << "func1: " << func1(5) << '\n';//9int main() { std::vector<int> c = {1, 2, 3, 4, 5, 6, 7}; int x = 5; c.erase(std::remove_if(c.begin(), c.end(), [x](int n) { return n < x; }), c.end()); std::cout << "c: "; std::for_each(c.begin(), c.end(), [](int i){ std::cout << i << ' '; }); std::cout << '\n'; // 闭包的类型不能被指名,但可用 auto 提及 // C++14 起,lambda 能拥有自身的默认实参 auto func1 = [](int i = 6) { return i + 4; }; std::cout << "func1: " << func1() << '\n'; //10 std::cout << "func1: " << func1(5) << '\n'; //9 // 与所有可调用对象相同,闭包能可以被捕获到 std::function 之中 // (这可能带来不必要的开销) std::function<int(int)> func2 = [](int i) { return i + 4; }; std::cout << "func2: " << func2(6) << '\n'; }
-
比较函数指针,函数符和lambda函数
lambda的本身就是一个函数,那么与其他函数相对比lambda函数有何优势和劣势,距离,简洁,效率和功能
c++ 中lambda主要目的是,让你能够将类似于函数的表达式用作接受函数指针或函数符的参数。