Skip to content

Commit 6f0cc2e

Browse files
author
刘佳玮
committed
fixbug of lambda
1 parent 1496935 commit 6f0cc2e

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

docs/lambda.md

+19-5
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ int main() {
314314

315315
> {{ icon.tip }} 高层封装 API 应当可以完全通过调用底层 API 实现,提供高层 API 只是方便初级用户使用和理解。
316316
317-
> {{ icon.story }}
317+
> {{ icon.story }}
318318
例如 `libcurl` 就提供了 `curl_easy` 和 `curl_multi` 两套 API。
319319

320320
- `curl_multi` 提供了超详细的参数,把每个操作分拆成多步,方便用户插手细节,满足高级用户的定制化需求,但太过复杂,难以学习。
@@ -526,6 +526,20 @@ int generic_sum(std::vector<int> const &v, Op op) {
526526

527527
> {{ icon.fun }} C++11:auto 只能用于定义变量;C++14:函数返回类型可以是 auto;C++17:模板参数也可以 auto;C++20:函数参数也可以是 auto 了;(狂想)C++47:auto 现在是 C++47 的唯一关键字,用户只需不断输入 auto-auto-auto,编译器内建人工智能自动识别你的意图生成机器码。
528528
529+
使用模板调用时,通常需要指定模板参数 `Op` 的类型:
530+
531+
```cpp
532+
generic_sum<std::function<int(int, int)>>(a, add);
533+
```
534+
535+
`std::function<int(int, int)>` 是什么鬼画符?别担心小彭老师会在下文讲解 `function` 这个容器。这里可以简单理解为这是一个接受两个 `int` 类型的参数,返回值也是 `int` 类型的函数容器,容纳 `add` 这个函数。不过也可以让编译器去自动推导模板参数:
536+
537+
```cpp
538+
generic_sum(a, add);
539+
```
540+
541+
这和上面的代码是等价的。
542+
529543
### 函数也是对象!
530544
531545
在过去的**面向对象编程范式*中,函数(代码)和对象(数据)被*割裂*开来,他们愚昧地认为*函数不是对象**。
@@ -1629,7 +1643,7 @@ auto lambda = [b] (int a) {
16291643
16301644
```cpp
16311645
int b = 2;
1632-
std::function<void(int)> lambda = [b] (int a) {
1646+
std::function<int(int)> lambda = [b] (int a) {
16331647
return a + b;
16341648
};
16351649
```
@@ -1638,15 +1652,15 @@ std::function<void(int)> lambda = [b] (int a) {
16381652

16391653
```cpp
16401654
// vector<auto> lambda_list; // 错误:不支持的语法
1641-
vector<function<void(int)>> lambda_list; // OK
1655+
vector<function<int(int)>> lambda_list; // OK
16421656

16431657
int b = 2;
16441658
lambda_list.push_back([b] (int a) {
16451659
return a + b;
1646-
};
1660+
});
16471661
lambda_list.push_back([b] (int a) {
16481662
return a * b;
1649-
};
1663+
});
16501664

16511665
for (auto lambda: lambda_list) {
16521666
int ret = lambda(2);

0 commit comments

Comments
 (0)