Определена ли реализация, какие алгоритмы могут принимать изменчивую лямбду? - PullRequest
0 голосов
/ 04 октября 2018

Я нашел здесь , что лямбда-выражения захвачены по значению.Это означает, что если алгоритм внутренне использует второй алгоритм, который принимает значение лямбды по значению, любое изменяемое состояние лямбда не будет сохранено.Я опубликую свой пример связанных вопросов здесь:

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 лямбды.Есть ли список других функций, которые определены реализацией?

1 Ответ

0 голосов
/ 04 октября 2018

Да, это так.См. [Gorithms.requirements]:

http://eel.is/c++draft/algorithms#requirements-9

[Примечание: если не указано иное, алгоритмы, которые принимают объекты функций в качестве аргументов, могут свободно копировать эти объекты функций.Программисты, для которых важна идентификация объекта, должны рассмотреть возможность использования класса-обертки, который указывает на некопированный объект реализации, такой как reference_wrapper, или какое-либо эквивалентное решение.- конец примечания]

...