std:: indirectly_unary_invocable, std:: indirectly_regular_unary_invocable
|
Definiert im Header
<iterator>
|
||
std::indirectly_unary_invocable
|
||
|
template
<
class
F,
class
I
>
concept indirectly_unary_invocable
=
|
(seit C++20) | |
std::indirectly_regular_unary_invocable
|
||
|
template
<
class
F,
class
I
>
concept indirectly_regular_unary_invocable
=
|
(seit C++20) | |
Die Konzepte
indirectly_unary_invocable
und
indirectly_regular_unary_invocable
spezifizieren Anforderungen für Algorithmen, die (reguläre) unäre Aufrufbare als ihre Argumente aufrufen. Der Hauptunterschied zwischen diesen Konzepten und
std::invocable
besteht darin, dass sie auf den Typ angewendet werden, auf den
I
referenziert, und nicht auf
I
selbst.
Hinweise
Der Unterschied zwischen
indirectly_unary_invocable
und
indirectly_regular_unary_invocable
ist rein semantisch.
Beispiel
#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)>; // Fehler (ergab false) bis P2609R3: // dies war weil 'std::iter_value_t<Proj> &' dasselbe ist wie 'IntWrapper&' // was nicht konvertierbar zu 'IntWrapper' ist (implizit gelöschter Copy-Konstruktor) static_assert(std::indirectly_unary_invocable<decltype(print), Proj>); // wenn die obige Compilezeit-Prüfung true ergibt, dann ist dies wohlgeformt: std::ranges::for_each(ints, print, wrap); }
Ausgabe:
1 2 3 4 5 6 7 8 9
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| P2609R3 | C++20 |
einige Anforderungen wurden definiert in Bezug auf
std::
iter_value_t
<
I
>
&
was Projektionen falsch behandelte, was zu Inkompatibilität mit aufrufbar F & führte |
definiert in Bezug auf
/*indirect-value-t*/
<
I
>
um solche Projektionen korrekt zu behandeln |
| P2997R1 | C++20 |
entsprechende Konzepte erforderten
F
&
zu erfüllen
invocable
und
regular_invocable
, jeweils mit
std::
iter_common_reference_t
<
I
>
|
erfordert nicht |