@@ -27,12 +27,12 @@ Lambda 表达式的基本语法如下:
27
27
上面的语法规则除了 ` [捕获列表] ` 内的东西外,其他部分都很好理解,只是一般函数的函数名被略去,
28
28
返回值使用了一个 ` -> ` 的形式进行(我们在上一节前面的尾返回类型已经提到过这种写法了)。
29
29
30
- 所谓捕获列表,其实可以理解为参数的一种类型,lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,
30
+ 所谓捕获列表,其实可以理解为参数的一种类型,Lambda 表达式内部函数体在默认情况下是不能够使用函数体外部的变量的,
31
31
这时候捕获列表可以起到传递外部数据的作用。根据传递的行为,捕获列表也分为以下几种:
32
32
33
33
#### 1. 值捕获
34
34
35
- 与参数传值类似,值捕获的前提是变量可以拷贝,不同之处则在于,被捕获的变量在 lambda 表达式被创建时拷贝,
35
+ 与参数传值类似,值捕获的前提是变量可以拷贝,不同之处则在于,被捕获的变量在 Lambda 表达式被创建时拷贝,
36
36
而非调用时才拷贝:
37
37
38
38
``` cpp
@@ -72,7 +72,7 @@ void lambda_reference_capture() {
72
72
手动书写捕获列表有时候是非常复杂的,这种机械性的工作可以交给编译器来处理,这时候可以在捕获列表中写一个
73
73
` & ` 或 ` = ` 向编译器声明采用引用捕获或者值捕获.
74
74
75
- 总结一下,捕获提供了lambda 表达式对外部值进行使用的功能,捕获列表的最常用的四种形式可以是:
75
+ 总结一下,捕获提供了 Lambda 表达式对外部值进行使用的功能,捕获列表的最常用的四种形式可以是:
76
76
77
77
- \[\] 空捕获列表
78
78
- \[ name1, name2, ...\] 捕获一系列变量
@@ -157,7 +157,7 @@ int main() {
157
157
158
158
C++11 ` std::function ` 是一种通用、多态的函数封装,
159
159
它的实例可以对任何可以调用的目标实体进行存储、复制和调用操作,
160
- 它也是对 C++中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的),
160
+ 它也是对 C++ 中现有的可调用实体的一种类型安全的包裹(相对来说,函数指针的调用不是类型安全的),
161
161
换句话说,就是函数的容器。当我们有了函数的容器之后便能够更加方便的将函数、函数指针作为对象进行处理。
162
162
例如:
163
163
@@ -241,7 +241,7 @@ int main() {
241
241
}
242
242
```
243
243
244
- **将亡值(xvalue, expiring value)**,是 C++11 为了引入右值引用而提出的概念(因此在传统 C++中,
244
+ **将亡值(xvalue, expiring value)**,是 C++11 为了引入右值引用而提出的概念(因此在传统 C++ 中,
245
245
纯右值和右值是同一个概念),也就是即将被销毁、却能够被移动的值。
246
246
247
247
将亡值可能稍有些难以理解,我们来看这样的代码:
@@ -256,7 +256,7 @@ std::vector<int> v = foo();
256
256
```
257
257
258
258
在这样的代码中,就传统的理解而言,函数 ` foo ` 的返回值 ` temp ` 在内部创建然后被赋值给 ` v ` ,
259
- 然而 ` v ` 获得这个对象时,会将整个 temp 拷贝一份,然后把 ` temp ` 销毁,如果这个 ` temp ` 非常大,
259
+ 然而 ` v ` 获得这个对象时,会将整个 ` temp ` 拷贝一份,然后把 ` temp ` 销毁,如果这个 ` temp ` 非常大,
260
260
这将造成大量额外的开销(这也就是传统 C++ 一直被诟病的问题)。在最后一行中,` v ` 是左值、
261
261
` foo() ` 返回的值就是右值(也是纯右值)。但是,` v ` 可以被别的变量捕获到,
262
262
而 ` foo() ` 产生的那个返回值作为一个临时值,一旦被 ` v ` 复制后,将立即被销毁,无法获取、也不能修改。
0 commit comments