说实话,你得到的结果似乎是我所期望的。让我们来看看你的第一个例子:
1.
list.push_back([&list](){ list.push_back([](){ throw; }); });
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
v
[lambda]----[end]
2.开始迭代列表
迭代 1:
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
v
[lambda]----[end]
^
+-- current
f() 呼叫list.push_back([](){ throw; });
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
v
[lambda]----[inner_lambda]----[end]
^
+-- current
迭代 2:(++current)
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
v
[lambda]----[inner_lambda]----[end]
^
+-- current
f() 呼叫throw;
结束
现在让我们换个方向。
首先,看看反向迭代器是如何表示的——这很重要(图片来自 cppreference):
重要的部分是:反向结束点到正常开始。但问题是,对于列表,可以在begin 之前插入一些内容,但在end 之后是不可能的。该不变量被反向迭代器破坏。
1.
list.push_front([&list](){ list.push_front([](){ throw; }); });
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
|
|+-- list.rend().base()
||
|| +-- list.rbegin().base()
vv v
[lambda]----[end]
2.开始迭代列表
迭代 1:
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
|
|+-- list.rend().base()
||
|| +-- list.rbegin().base()
vv v
[lambda]----[end]
^ ^
| +---- current
|
+--------- passed list.rend()
*current 产生[lambda]。
f() 呼叫list.push_front([](){ throw; });
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
|
|+-- list.rend().base()
||
|| +-- list.rbegin().base()
vv v
[inner_lambda]----[lambda]----[end]
^ ^
| +---- current
|
+--------- passed list.rend().base()
请注意,传递的list.rend().base() 没有改变 - 但它不再指向第一个(经过最后一个反转的)元素。
迭代 2:(++current)
+-- list.begin() (not necessarily what has been passed to for_each)
|
|+-- list.rend().base()
||
|| +-- list.rbegin().base()
vv v
[inner_lambda]----[lambda]----[end]
^ ^
| +---- current
|
+--------- passed list.rend().base()
current == passed list.rend().base()
结束
现在让我们尝试另一个我的错误是这部分与向前迭代列表相关:
1.
list.push_front([&list](){ list.push_front([](){ throw; }); });
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
v
[lambda]----[end]
2.开始迭代列表
迭代 1:
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
v
[lambda]----[end]
^
+-- current
f() 呼叫list.push_front([](){ throw; });
当前的迭代器没有失效和/或指向其他地方而不是它已经指向的地方。
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
v
[inner_lambda]----[lambda]----[end]
^
+-- current
迭代 2:(++current)
列表状态:
+-- list.begin() (not necessarily what has been passed to for_each)
v
[inner_lambda]----[lambda]----[end]
^
+-- current
结束