я нашел Вот что лямбды захвачены ценностью. Это означает, что если алгоритм внутренне использует второй алгоритм, который принимает значение лямбды по значению, любое изменяемое состояние лямбда не будет сохранено. Я буду публиковать мой пример связанных вопросов здесь:
remove_if(begin(values), end(values), [i = 0U, it = cbegin(intervals), end = cend(intervals)](const auto&) mutable {
return it != end && ++i > it->first && (i <= it->second || (++it, true));
})
Итак, на момент написания моего первоначального вопроса remove_if
имело определенное поведение для реализации mutable
лямбда. Есть ли список других функций, которые определены реализацией?
Да, это.
См. [Алгоритмы. Требования]:
http://eel.is/c++draft/algorithms#requirements-9
[Примечание: если не указано иное, алгоритмы, которые принимают функциональные объекты в качестве аргументов, могут свободно копировать эти функциональные объекты. Программистам, для которых важна идентификация объекта, следует рассмотреть возможность использования класса-обертки, который указывает на некопированный объект реализации, такой как reference_wrapper, или какое-либо эквивалентное решение. — конец примечания]
Других решений пока нет …