Почему ranges::for_each возвращает функцию? ⇐ C++
-
Anonymous
Почему ranges::for_each возвращает функцию?
Устаревшая функция std::for_each возвращает функцию, поскольку стандартная только требует, чтобы Function соответствовала Cpp17MoveConstructible в соответствии с [alg.foreach]:
шаблон constexpr Function for_each (сначала InputIterator, последний InputIterator, функция f); Предварительные условия: Функция соответствует требованиям Cpp17MoveConstructible.
[Примечание: Функция не обязательно должна соответствовать требованиям Cpp17CopyConstructible. последнее примечание]
Это разумно, поскольку пользователь может захотеть повторно использовать функцию после вызова.
Параллельная версия for_each не имеет возврата:
шаблон void for_each(ExecutionPolicy&& exec, Сначала ForwardIterator, потом ForwardIterator, Функция f); Предварительные условия: Функция соответствует требованиям Cpp17CopyConstructible.
Это связано с тем, что стандарт требует, чтобы Function соответствовал Cpp17CopyConstructible, поэтому возврат функции не требуется, поскольку пользователь может свободно создать копию. если они хотят на стороне вызова.
Я заметил, что ranges::for_each также возвращает функцию:
template constexpr ranges::for_each_result ranges::for_each(I первый, S последний, Fun f, Proj proj = {}); Однако сигнатура функции уже требует, чтобы Fun удовлетворял indirectly_unary_invocable, что уже гарантирует возможность копирования.
Вопрос в том, почему ranges::for_each все еще возвращает функцию? Какой смысл это делать?
Устаревшая функция std::for_each возвращает функцию, поскольку стандартная только требует, чтобы Function соответствовала Cpp17MoveConstructible в соответствии с [alg.foreach]:
шаблон constexpr Function for_each (сначала InputIterator, последний InputIterator, функция f); Предварительные условия: Функция соответствует требованиям Cpp17MoveConstructible.
[Примечание: Функция не обязательно должна соответствовать требованиям Cpp17CopyConstructible. последнее примечание]
Это разумно, поскольку пользователь может захотеть повторно использовать функцию после вызова.
Параллельная версия for_each не имеет возврата:
шаблон void for_each(ExecutionPolicy&& exec, Сначала ForwardIterator, потом ForwardIterator, Функция f); Предварительные условия: Функция соответствует требованиям Cpp17CopyConstructible.
Это связано с тем, что стандарт требует, чтобы Function соответствовал Cpp17CopyConstructible, поэтому возврат функции не требуется, поскольку пользователь может свободно создать копию. если они хотят на стороне вызова.
Я заметил, что ranges::for_each также возвращает функцию:
template constexpr ranges::for_each_result ranges::for_each(I первый, S последний, Fun f, Proj proj = {}); Однако сигнатура функции уже требует, чтобы Fun удовлетворял indirectly_unary_invocable, что уже гарантирует возможность копирования.
Вопрос в том, почему ranges::for_each все еще возвращает функцию? Какой смысл это делать?
Мобильная версия