Возможно ли вывести элементы list используя for_each?
А почему должно? list - это вам не массив, где элементы лежат одним куском в памяти. Вообще говоря, вас не должно волновать, как они там лежат, используйте .begin() и .end() для получения итераторов на начало и конец списка. И в данном случае можно было бы применить range based for.
Откройте документацию хотя бы, и прочитайте про входные параметры for_each:template< class InputIt, class UnaryFunction >
UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );
От вас требуют на вход итератор на первый элемент first и итератор на последний элемент last. Ниже можно найти, что InputIt значит InputIterator.
Теперь смотрим документацию std::list.Iterators
begin   returns an iterator to the beginning 
cbegin  (public member function)

end     returns an iterator to the end 
cend    (public member function)
То, что нам нужно. begin() даст нам итератор на первый элемент, т.е. first, а end() — на last.
Смотрим дальшеMember types
Member type	Definition

iterator	BidirectionalIterator
Смотрим, что такое BidirectionalIterator. Написано, что он должен быть в свою очередь ForwardIterator'ом. А ForwardIterator удовлетворяет концепту InputIterator. Как раз то, что нам нужно.
В итоге, достаточно написать for_each(test.begin(), test.end(), show);
Но, сейчас на дворе 2017 год, давно уже введены новые фишки в C++. Например, можно сходу передать анонимную функцию (лямбду) вместо обычной функции, в случае, если она однострочная: for_each(test.cbegin(), test.cend(), [](int v) {std::cout << v << std::endl;});
Также, C++11 добавляет новые методы для получения константного итератора cbegin() и cend(), т. к. нам не нужно модифицировать список, лучше воспользоваться константными итераторами, чтобы избежать ошибок в случае случайной модификации.
Либо, как уже сказали, если у вас слишком большое тело цикла, чтобы не городить из лямбд спагетти и чтобы это всё легко читалось, можно использовать range-for:for(const auto &v : test)
  std::cout << n << ' ';
std::cout << '\n';