mirror of
https://github.com/CnTransGroup/EffectiveModernCppChinese.git
synced 2025-03-10 17:20:19 +08:00
add some comment
This commit is contained in:
parent
b716af6b67
commit
264de26c9c
@ -40,16 +40,16 @@ C++11中有两种默认的捕获模式:按引用捕获和按值捕获。但按
|
|||||||
按引用捕获会导致闭包中包含了对局部变量或者某个形参(位于定义lambda的作用域)的引用,如果该lambda创建的闭包生命周期超过了局部变量或者参数的生命周期,那么闭包中的引用将会变成悬空引用。举个例子,假如我们有一个元素是过滤函数的容器,该函数接受一个int作为参数,并返回一个布尔值,该布尔值的结果表示传入的值是否满足过滤条件。
|
按引用捕获会导致闭包中包含了对局部变量或者某个形参(位于定义lambda的作用域)的引用,如果该lambda创建的闭包生命周期超过了局部变量或者参数的生命周期,那么闭包中的引用将会变成悬空引用。举个例子,假如我们有一个元素是过滤函数的容器,该函数接受一个int作为参数,并返回一个布尔值,该布尔值的结果表示传入的值是否满足过滤条件。
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
using FilterContainer = // see Item 9 for
|
using FilterContainer = // see Item 9 for
|
||||||
std::vector<std::function<bool(int)>>; // "using", Item 2
|
std::vector<std::function<bool(int)>>; // "using", Item 2
|
||||||
// for std::function
|
// for std::function
|
||||||
FilterContainer filters; // filtering funcs
|
FilterContainer filters; // filtering funcs
|
||||||
```
|
```
|
||||||
|
|
||||||
我们可以添加一个过滤器,用来过滤掉5的倍数。
|
我们可以添加一个过滤器,用来过滤掉5的倍数。
|
||||||
|
|
||||||
```c++
|
```c++
|
||||||
filters.emplace_back( // see Item 42 for
|
filters.emplace_back( // see Item 42 for
|
||||||
[](int value) { return value % 5 == 0; } // info on
|
[](int value) { return value % 5 == 0; } // info on
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
@ -62,11 +62,11 @@ void addDivisorFilter()
|
|||||||
auto calc1 = computeSomeValue1();
|
auto calc1 = computeSomeValue1();
|
||||||
auto calc2 = computeSomeValue2();
|
auto calc2 = computeSomeValue2();
|
||||||
auto divisor = computeDivisor(calc1, calc2);
|
auto divisor = computeDivisor(calc1, calc2);
|
||||||
filters.emplace_back( // danger!
|
filters.emplace_back( // danger!
|
||||||
[&](int value) { return value % divisor == 0; } // ref to
|
[&](int value) { return value % divisor == 0; } // ref to
|
||||||
); // divisor
|
); // divisor
|
||||||
} // will
|
} // will
|
||||||
// dangle!
|
// dangle!
|
||||||
```
|
```
|
||||||
|
|
||||||
这个代码实现是一个定时炸弹。lambda对局部变量divisor进行了引用,但该变量的生命周期会在addDivisorFilter返回时结束,刚好就是在语句filters.emplace_back返回之后,因此该函数的本质就是容器添加完,该函数就死亡了。使用这个filter会导致未定义行为,这是由它被创建那一刻起就决定了的。
|
这个代码实现是一个定时炸弹。lambda对局部变量divisor进行了引用,但该变量的生命周期会在addDivisorFilter返回时结束,刚好就是在语句filters.emplace_back返回之后,因此该函数的本质就是容器添加完,该函数就死亡了。使用这个filter会导致未定义行为,这是由它被创建那一刻起就决定了的。
|
||||||
|
Loading…
Reference in New Issue
Block a user