std:: indirectly_unary_invocable, std:: indirectly_regular_unary_invocable
|
Определено в заголовочном файле
<iterator>
|
||
std::indirectly_unary_invocable
|
||
|
template
<
class
F,
class
I
>
concept indirectly_unary_invocable
=
|
(начиная с C++20) | |
std::indirectly_regular_unary_invocable
|
||
|
template
<
class
F,
class
I
>
concept indirectly_regular_unary_invocable
=
|
(начиная с C++20) | |
Концепты
indirectly_unary_invocable
и
indirectly_regular_unary_invocable
определяют требования к алгоритмам, которые вызывают (регулярные) унарные вызываемые объекты в качестве своих аргументов. Ключевое различие между этими концептами и
std::invocable
заключается в том, что они применяются к типу, на который ссылается
I
, а не к самому
I
.
Примечания
Различие между
indirectly_unary_invocable
и
indirectly_regular_unary_invocable
является чисто семантическим.
Пример
#include <algorithm> #include <iterator> #include <print> #include <ranges> struct IntWrapper { int i; explicit IntWrapper(int i) : i(i) {} IntWrapper(IntWrapper&&) = default; IntWrapper& operator=(IntWrapper&&) = default; }; int main() { auto ints = std::views::iota(1, 10); auto print = [] (IntWrapper w) { std::print("{} ", w.i); }; auto wrap = [] (int i) { return IntWrapper{i}; }; using Proj = std::projected<decltype(ints.begin()), decltype(wrap)>; // ошибка (вычислялось как false) до P2609R3: // это было потому, что 'std::iter_value_t<Proj> &' совпадает с 'IntWrapper&' // что не конвертируется в 'IntWrapper' (неявно удаленный конструктор копирования) static_assert(std::indirectly_unary_invocable<decltype(print), Proj>); // если проверка времени компиляции выше вычисляется как true, тогда это корректно: std::ranges::for_each(ints, print, wrap); }
Вывод:
1 2 3 4 5 6 7 8 9
Отчёты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Исправленное поведение |
|---|---|---|---|
| P2609R3 | C++20 |
некоторые требования были определены в терминах
std::
iter_value_t
<
I
>
&
что неправильно обрабатывало проекции, приводя к несовместимости с вызываемым F & |
определено в терминах
/*indirect-value-t*/
<
I
>
для корректной обработки таких проекций |
| P2997R1 | C++20 |
соответствующие концепции требовали
F
&
удовлетворять
invocable
и
regular_invocable
, соответственно, с
std::
iter_common_reference_t
<
I
>
|
не требует |