Как указано выше, for_each классифицируется как «алгоритм немутации»
'Мутирующим' аналогом STL является std :: transform.
Поскольку вы указали, что знаете, что можете использовать std :: transform, вышеприведенное действительно становится точкой. Он служит точкой связи с людьми, которые читают ваш код.
Если я увижу std :: for_each, ясно, что, что бы ни делал foo, он не изменит контейнер.
Указание, которому я следую, может быть сформулировано:
"Если вы хотите использовать элементы контейнера для выполнения какой-либо задачи, которая не изменяет элементы, используйте std :: for_each.
Если вы хотите использовать элементы контейнера для системного изменения элементов или использовать их в задании, которое каким-либо образом изменит их, используйте std :: transform. "