mirror of
https://github.com/changkun/modern-cpp-tutorial.git
synced 2025-12-17 12:44:40 +03:00
@@ -27,12 +27,12 @@ Lambda 表达式的基本语法如下:
|
|||||||
上面的语法规则除了 `[捕获列表]` 内的东西外,其他部分都很好理解,只是一般函数的函数名被略去,
|
上面的语法规则除了 `[捕获列表]` 内的东西外,其他部分都很好理解,只是一般函数的函数名被略去,
|
||||||
返回值使用了一个 `->` 的形式进行(我们在上一节前面的尾返回类型已经提到过这种写法了)。
|
返回值使用了一个 `->` 的形式进行(我们在上一节前面的尾返回类型已经提到过这种写法了)。
|
||||||
|
|
||||||
所谓捕获列表,其实可以理解为参数的一种类型,lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,
|
所谓捕获列表,其实可以理解为参数的一种类型,Lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,
|
||||||
这时候捕获列表可以起到传递外部数据的作用。根据传递的行为,捕获列表也分为以下几种:
|
这时候捕获列表可以起到传递外部数据的作用。根据传递的行为,捕获列表也分为以下几种:
|
||||||
|
|
||||||
#### 1. 值捕获
|
#### 1. 值捕获
|
||||||
|
|
||||||
与参数传值类似,值捕获的前提是变量可以拷贝,不同之处则在于,被捕获的变量在 lambda 表达式被创建时拷贝,
|
与参数传值类似,值捕获的前提是变量可以拷贝,不同之处则在于,被捕获的变量在 Lambda 表达式被创建时拷贝,
|
||||||
而非调用时才拷贝:
|
而非调用时才拷贝:
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
@@ -72,7 +72,7 @@ void lambda_reference_capture() {
|
|||||||
手动书写捕获列表有时候是非常复杂的,这种机械性的工作可以交给编译器来处理,这时候可以在捕获列表中写一个
|
手动书写捕获列表有时候是非常复杂的,这种机械性的工作可以交给编译器来处理,这时候可以在捕获列表中写一个
|
||||||
`&` 或 `=` 向编译器声明采用引用捕获或者值捕获.
|
`&` 或 `=` 向编译器声明采用引用捕获或者值捕获.
|
||||||
|
|
||||||
总结一下,捕获提供了lambda 表达式对外部值进行使用的功能,捕获列表的最常用的四种形式可以是:
|
总结一下,捕获提供了 Lambda 表达式对外部值进行使用的功能,捕获列表的最常用的四种形式可以是:
|
||||||
|
|
||||||
- \[\] 空捕获列表
|
- \[\] 空捕获列表
|
||||||
- \[name1, name2, ...\] 捕获一系列变量
|
- \[name1, name2, ...\] 捕获一系列变量
|
||||||
@@ -256,7 +256,7 @@ std::vector<int> v = foo();
|
|||||||
```
|
```
|
||||||
|
|
||||||
在这样的代码中,就传统的理解而言,函数 `foo` 的返回值 `temp` 在内部创建然后被赋值给 `v`,
|
在这样的代码中,就传统的理解而言,函数 `foo` 的返回值 `temp` 在内部创建然后被赋值给 `v`,
|
||||||
然而 `v` 获得这个对象时,会将整个 temp 拷贝一份,然后把 `temp` 销毁,如果这个 `temp` 非常大,
|
然而 `v` 获得这个对象时,会将整个 `temp` 拷贝一份,然后把 `temp` 销毁,如果这个 `temp` 非常大,
|
||||||
这将造成大量额外的开销(这也就是传统 C++ 一直被诟病的问题)。在最后一行中,`v` 是左值、
|
这将造成大量额外的开销(这也就是传统 C++ 一直被诟病的问题)。在最后一行中,`v` 是左值、
|
||||||
`foo()` 返回的值就是右值(也是纯右值)。但是,`v` 可以被别的变量捕获到,
|
`foo()` 返回的值就是右值(也是纯右值)。但是,`v` 可以被别的变量捕获到,
|
||||||
而 `foo()` 产生的那个返回值作为一个临时值,一旦被 `v` 复制后,将立即被销毁,无法获取、也不能修改。
|
而 `foo()` 产生的那个返回值作为一个临时值,一旦被 `v` 复制后,将立即被销毁,无法获取、也不能修改。
|
||||||
|
|||||||
Reference in New Issue
Block a user