Simulate Turing machine
I believe you're looking for std::prev:

std::prev(tape.end());


The linked page even states the exact comparison of the two:


  Although the expression --c.end() often compiles, it is not guaranteed to do so: c.end() is an rvalue expression, and there is no iterator requirement that specifies that decrement of an rvalue is guaranteed to work. In particular, when iterators are implemented as pointers, --c.end() does not compile, while std::prev(c.end()) does.


I do have some additional points as well:


typedef isn't needed for enums in C++.
Since tape is a storage container of a primitive type (ints), the default constructor will zero-initialize it automatically.  As such, you don't need to assign to {0}.

std::list&lt;int&gt; tape;


In case you want to verify it right away, take a look at this test.
It may be more useful to use auto with head:

auto head = tape.begin();


This allows for less typing and for any iterator type (if it ever changes).
You could put these "test machines" in a separate file or somewhere separate from the main implementation.  Proper unit testing may be preferred, but I don't have much to say about that.  I'd also rename them as such as it's best not to use single-variable names outside of loop counters.

Another note: you can omit the = for each std::array for C++11 list initialization.
main() seems to be handling too much of the logic.  Have other functions handle it and only have main() initialize variables, call these functions, then output the results.
return 0 or similar isn't needed at the very end of main(); it'll always do the same return at this point.