Honestly, the results you get seem to be what I expected. Skip the first example:
one.
list.push_back([&list](){ list.push_back([](){ throw; }); });
List Status:
+-- list.begin() (not necessarily what has been passed to for_each) v [lambda]----[end]
2. start iterating over the list
Iteration 1:
List Status:
+-- list.begin() (not necessarily what has been passed to for_each) v [lambda]----[end] ^ +-- current
f() calls list.push_back([](){ throw; });
List Status:
+-- list.begin() (not necessarily what has been passed to for_each) v [lambda]----[inner_lambda]----[end] ^ +-- current
Iteration 2: ( ++current )
List Status:
+-- list.begin() (not necessarily what has been passed to for_each) v [lambda]----[inner_lambda]----[end] ^ +-- current
f() calls throw;
end
Now let's do another direction.
First of all, look at how reverse iterators are actually represented - this is important (image from cppreference): 
The important part: return endpoints to a normal start. But the problem is that with the list you can insert something before begin , but this is not possible after end . This invariant splits into inverse iterators.
one.
list.push_front([&list](){ list.push_front([](){ throw; }); });
List Status:
+-- list.begin() (not necessarily what has been passed to for_each) | |+-- list.rend().base() || || +-- list.rbegin().base() vv v [lambda]----[end]
2. start iterating over the list
Iteration 1:
List Status:
+-- 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 gives [lambda] .
f() calls list.push_front([](){ throw; });
List Status:
+-- 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()
Note that the past list.rend().base() not changed - but it no longer points to the first (last last) element.
Iteration 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()
end
Now try another one by my mistake, this part is relevant for fast forward in the list :
one.
list.push_front([&list](){ list.push_front([](){ throw; }); });
List Status:
+-- list.begin() (not necessarily what has been passed to for_each) v [lambda]----[end]
2. start iterating over the list
Iteration 1:
List Status:
+-- list.begin() (not necessarily what has been passed to for_each) v [lambda]----[end] ^ +-- current
f() calls list.push_front([](){ throw; });
The current iterator is not recognized as invalid and / or is not indicated elsewhere than it has already indicated.
List Status:
+-- list.begin() (not necessarily what has been passed to for_each) v [inner_lambda]----[lambda]----[end] ^ +-- current
Iteration 2: ( ++current )
List Status:
+-- list.begin() (not necessarily what has been passed to for_each) v [inner_lambda]----[lambda]----[end] ^ +-- current
end