您的位置:首页 > 编程语言 > C语言/C++

C++11新特性:Lambda函数(匿名函数) 一段代码即可理解

2016-08-29 10:03 393 查看
C++11新特性:Lambda函数(匿名函数) 一段代码即可理解

基本lambda语法

基本形式如下:

[capture](parameters)->return-type {body}

[]叫做捕获说明符,表示一个lambda表达式的开始。接下来是参数列表,即这个匿名的lambda函数的参数,->return-type表示返回类型,如果没有返回类型,则可以省略这部分。返回类型的表示法,这涉及到c++11的另一特性:自动类型推导,最后就是函数体部分了。匿名函数与普通函数在结构上都是一样,即有传入值,有函数体,唯一就缺函数名而已。

我们可以这样输出"hello,world"

// 定义一个匿名函数,然后用指针指向此函数

auto func = [] () { cout << "hello,world"; };

// 调用函数

func();

关于[] 捕获说明符:

(其实就是如何调用匿名函数所在的函数中的变量)

[] 不截取任何变量

[&} 截取外部作用域中所有变量,并作为引用在函数体中使用

[=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用

[=, ¶m]   截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对param变量使用引用

[param]   截取param变量并且拷贝一份在函数体重使用,同时不截取其他变量

[this]            截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

运行下述代码,即可速度掌握Lambda函数

// C++11新特性:Lambda函数(匿名函数)
#include <iostream>  
#include <typeinfo>  
using namespace std;
 
int main(void)
{
// 将创建的匿名函数赋值给sum  
auto sum = [](int x,
int y)
-> int {return x +
y; };
 
// typeid用于返回指针或引用所指对象的实际类型,typeid是操作符,不是函数
// 输出:class <lambda_c2f1f973a39f2b265512c>

std::cout
<< typeid(sum).name()
<< std::endl;
 
int x = 10, y = 20;
auto result = sum(x, y);
 
// 输出: result:30
std::cout
<< "result : " << result
<< std::endl;
 
// 只是声明了一个lambda函数,但未调用  
[] {
std::cout
<< "Done1" << std::endl;
};
 
// 声明并调用一个lambda函数  
// 输出: Done2
[] {
std::cout
<< "Done2" << std::endl;
}();
 
int a = 1, b = 10;
//    无法通过编译  
//    [] {  
//        return a + b; // 错误:‘a’未被捕获      错误:‘b’未被捕获  
//    };  
 
// [=] 通过捕捉,获得上下文的数据,所以可以使用变量a,b,但无法修改a,b  
[=] {
return a + b;
};
 
// 输出:b = 10
std::cout
<< "b = " << b
<< std::endl;
 
// [&] 捕捉上下文,并且可以修改a,b  
[&](int c)
{
b = a +
c;
}(50);
 
// 输出:b = 51
std::cout
<< "b = " << b
<< std::endl;
 
//    [&a, b] (int c) {   // a可以在函数体中被修改,而b不能  
//        b = a + c;  
//    }(1000);  
 
auto b2 = [a, &b](int c)
-> int {
// a只读, b读写  
b = a +
c;
return a +
c;
}(1000);
 
// 输出: b1 = 1001 b2 = 1001
std::cout
<< "b = " << b
<< "  b2 = " << b2
<< std::endl;
 
int n = getchar();
return 0;
}
 
运行结果

 


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Lambda函数