duct_view "cpp/ranges/cartesian product view") (C++23)  |  a [ ` view ` ](/w/cpp/ranges/view "cpp/ranges/view") consisting of tuples of results calculated by the n-ary cartesian product of the adapted views   
(class template)  (customization point object)  [ [edit]
](https://en.cppreference.com/mwiki/index.php?title=Template:cpp/ranges/dsc_cartesian_product_view&action=edit)  
[ ranges::concat_view  views::concat  ](/mwiki/index.php?title=cpp/ranges/concat_view&action=edit&redlink=1 "cpp/ranges/concat view \(page does not exist\)") (C++26)  |  a [ ` view ` ](/w/cpp/ranges/view "cpp/ranges/view") consisting of concatenation of the adapted views   
(class template)  (customization point object)  [ [edit]
](https://en.cppreference.com/mwiki/index.php?title=Template:cpp/ranges/dsc_concat_view&action=edit)  
  
###  [ [ edit ](/mwiki/index.php?title=cpp/ranges&action=edit&section=3 "Edit
section: Range generators") ]  Range generators

Defined in header ` [ <generator> ](/w/cpp/header/generator
"cpp/header/generator") `  
---  
Defined in namespace ` std `  
[ generator  ](/w/cpp/coroutine/generator "cpp/coroutine/generator") (C++23)  |  A [ ` view ` ](/w/cpp/ranges/view "cpp/ranges/view") that represents synchronous [ coroutine ](/w/cpp/language/coroutines "cpp/language/coroutines") generator   
(class template)  [ [edit]
](https://en.cppreference.com/mwiki/index.php?title=Template:cpp/ranges/dsc_generator&action=edit)  
  
###  [ [ edit ](/mwiki/index.php?title=cpp/ranges&action=edit&section=4 "Edit
section: Helper items") ]  Helper items

####  [ [ edit ](/mwiki/index.php?title=cpp/ranges&action=edit&section=5 "Edit
section: Range adaptor objects") ]  Range adaptor objects

See [ RangeAdaptorObject  ](/w/cpp/named_req/RangeAdaptorObject "cpp/named
req/RangeAdaptorObject") (RAO).

####  [ [ edit ](/mwiki/index.php?title=cpp/ranges&action=edit&section=6 "Edit
section: Range adaptor closure objects") ]  Range adaptor closure objects

See [ RangeAdaptorClosureObject  ](/w/cpp/named_req/RangeAdaptorClosureObject
"cpp/named req/RangeAdaptorClosureObject") (RACO).

####  [ [ edit ](/mwiki/index.php?title=cpp/ranges&action=edit&section=7 "Edit
section: Customization point objects") ]  Customization point objects

See [ Customization point object ](/w/cpp/ranges/cpo "cpp/ranges/cpo") (CPO).

####  [ [ edit ](/mwiki/index.php?title=cpp/ranges&action=edit&section=8 "Edit
section: Assignable wrapper") ]  Assignable wrapper

Some range adaptors wrap their elements or function objects with the  [ `
_copyable-box_ ` ](/w/cpp/ranges/copyable_wrapper "cpp/ranges/copyable
wrapper") (until C++23)  [ ` _movable-box_ ` ](/w/cpp/ranges/copyable_wrapper
"cpp/ranges/copyable wrapper") (since C++23)  . The wrapper auguments the
wrapped object with assignability when needed.

####  [ [ edit ](/mwiki/index.php?title=cpp/ranges&action=edit&section=9 "Edit
section: Non-propagating cache") ]  Non-propagating cache

Some range adaptors are specified in terms of an exposition-only class
template [ _non-propagating-cache_ ](/mwiki/index.php?title=cpp/non-
propagating-cache&action=edit&redlink=1 "cpp/non-propagating-cache \(page does
not exist\)") , which behaves almost exactly like  [ std::  optional
](http://en.cppreference.com/w/cpp/utility/optional) < T  > (see description
for differences).

|  This section is incomplete  
Reason: Create the page for ` _non-propagating-cache_ ` [range.nonprop.cache]  
---|---  
  
####  [ [ edit ](/mwiki/index.php?title=cpp/ranges&action=edit&section=10
"Edit section: Customization point object helpers") ]  Customization point
object helpers

template  < [ ranges::  input_range
](http://en.cppreference.com/w/cpp/ranges/input_range) R  >  
constexpr  auto  & /* possibly-const-range */  (  R  & r  )  noexcept  
{  
if  constexpr  (  [ ranges::  constant_range
](http://en.cppreference.com/w/cpp/ranges/constant_range) < const  R  > &&  
!  [ ranges::  constant_range
](http://en.cppreference.com/w/cpp/ranges/constant_range) < R