std::projected
<iterator>
std::indirectly_regular_unary_invocable <I> Proj >
struct projected
{
using value_type = std::remove_cvref_t
<std::indirect_result_t <Proj&, I>>;
std::indirect_result_t <Proj&, I> operator*() const; // not defined
(until C++26)
std::indirectly_regular_unary_invocable <I> Proj >
struct incrementable_traits<std::projected <I, Proj>>
{
using difference_type = std::iter_difference_t <I>;
(until C++26)
struct /*projected-impl*/
{
struct /*type*/
{
using value_type = std::remove_cvref_t
<std::indirect_result_t <Proj&, I>>;
using difference_type =
std::iter_difference_t <I>; // conditionally present
std::indirect_result_t <Proj&, I> operator*() const; // not defined
};
(exposition only*)
projected
combines an indirectly_readable
type I
and a callable object type Proj
into a new indirectly_readable
type whose reference type is the result of applying Proj
to the std::iter_reference_t <I>.weakly_incrementable
type when I
is also a weakly_incrementable
type.difference_type
exists only if I
models weakly_incrementable
.projected
is used only to constrain algorithms that accept callable objects and projections, and hence its operator*() is not defined.
Contents
[edit] Template parameters
I
[edit] Notes
The indirect layer prevents I
and Proj
to be associated classes of projected
. When an associated class of I
or Proj
is an incomplete class type, the indirect layer avoids the unnecessary attempt to inspect the definition of that type that results in hard error.
[edit] Example
#include <algorithm> #include <cassert> #include <functional> #include <iterator> template<class T> struct Holder { T t; }; struct Incomplete; using P = Holder<Incomplete>*; static_assert(std::equality_comparable <P>); // OK static_assert(std::indirectly_comparable <P*, P*, std::equal_to <>>); // Error before C++26 static_assert(std::sortable <P*>); // Error before C++26 int main() { P a[10] = {}; // ten null pointers assert (std::count (a, a + 10, nullptr) == 10); // OK assert (std::ranges::count (a, a + 10, nullptr) == 10); // Error before C++26 }