C++11常用特性介绍——Lambda表达式
一、C++11采用配对的方括号[]来创建一个匿名函数并执行,如:
#include <iostream>
int main()
{
auto func = []{
std::cout << "hello world!!!" << std::endl;
};
func();
}
捕获选项:
1)[]:不捕获任何变量(没有使用任何函数对象参数)。
2)[=]:拷贝捕获(函数体内可以使用Lambda所在作用范围内所有可见局部变量,包括Lambda所在类的this,并且是值传递方式,函数体内不可以修改局变量)。
3)[&]:引用捕获(函数体内可以使用Lambda所在作用范围内所有可见局部变量,包括Lambda所在类的this,并且是引用传递方式,函数体内可以修改局变量)。
4)[this]:捕获this指针(函数体内可以使用Lambda所在类中的成员变量)。
5)[a]:指定拷贝(将变量a按值进行传递,函数体内不能修改传递进来的a拷贝,因为默认情况下函数是const的,修改传递进来的a拷贝,可以添加mutable修饰符)。
6)[&a]:指定引用(将a按引用进行传递,函数体内可以修改传递进来的a拷贝)。
7)[a,&b]:混合引用(将a按拷贝传递,b按引用传递)。
8)[=,&a]:混合引用(将其它可见局部变量按拷贝传递,b按引用传递)。
9)[a,&]:混合引用(将a按拷贝传递,其它可见局部变量按拷贝传递)。
实例:
1、不捕获任何变量
#include <iostream>
int main()
{
auto func = []{std::cout << "Hello World!!! << std::endl;} //输出:Hello World!!!
func();
}
2、拷贝捕获
include <iostream>
int main()
{
int i = 1024;
auto func = [=]{std::cout << i << std::endl;} //输出1024
func();
}
3、引用捕获
include <iostream>
int main()
{
int i = 1024;
auto func = [&]{std::cout << ++i << std::endl;} //输出1025
func();
}
4、捕获this指针
#include <iostream>
class Student
{
public:
Student(int age = 0) : _age(age){}
Show_Age()
{
auto func = [this]{
std::cout << this->_age << std::endl;
};
func();
}
private:
int _age;
}
int main()
{
Student student(1024);
student.Show_Age(); //输出1024
}
5、指定拷贝
include <iostream>
int main()
{
int i = 1024;
auto func = [i]{std::cout << i << std::endl;} //输出1024
func();
}
6、指定引用
#include <iostream>
int main()
{
int i = 1024;
auto func = [&i]{std::cout << ++i << std::endl;} //输出1025
func();
std::cout << i << std::endl; //输出1024
}