| ||||||||||||||||||||||
| Range primitives | |||||||
| |||||||
| Range concepts | |||||||||||||||||||
| |||||||||||||||||||
| Range factories | |||||||||
| |||||||||
| Range adaptors | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Helper items | |||||||||||||||||
| |||||||||||||||||
template<class T> requiresstd::copy_constructible<T>&&std::is_object_v<T> | (since C++20) (until C++23) (exposition only*) | |
template<class T> requiresstd::move_constructible<T>&&std::is_object_v<T> | (since C++23) (exposition only*) | |
ranges::single_view,ranges::repeat_view,(since C++23) and range adaptors that store an invocable object are specified in terms of an exposition-only class templatecopyable-box(until C++23)movable-box(since C++23). The name shown here is for exposition purposes only.
The wrapper behaves exactly likestd::optional<T>, except that the default constructor, copy assignment operator, and move assignment operator are (conditionally) different from those ofstd::optional, which augmentsT with assignability when needed and makes it always satisfycopyableormovable(since C++23).
If | (until C++23) |
If
/*movable-box*/<T> may store only a | (since C++23) |
Contents |
| T | - | the type of the contained value, must be an object type that modelscopy_constructible(until C++23)move_constructible(since C++23) |
constexpr/*copyable-box*/()noexcept(std::is_nothrow_default_constructible_v<T>) requiresstd::default_initializable<T> | (since C++20) (until C++23) | |
constexpr/*movable-box*/()noexcept(std::is_nothrow_default_constructible_v<T>) requiresstd::default_initializable<T> | (since C++23) | |
The default constructor is provided if and only ifT modelsdefault_initializable.
A default-constructed wrapper contains a value-initializedT object.
| (1) | ||
constexpr/*copyable-box*/& operator=(const/*copyable-box*/& other); noexcept(/* see below */); | (since C++20) (until C++23) | |
constexpr/*movable-box*/& operator=(const/*movable-box*/& other); noexcept(/* see below */) requiresstd::copy_constructible<T>; | (since C++23) | |
| (2) | ||
constexpr/*copyable-box*/& operator=(/*copyable-box*/&& other) noexcept(std::is_nothrow_move_constructible_v<T>); | (since C++20) (until C++23) | |
constexpr/*movable-box*/& operator=(/*movable-box*/&& other) noexcept(std::is_nothrow_move_constructible_v<T>); | (since C++23) | |
constexpr/*copyable-box*/& operator=(const/*copyable-box*/& other) | (until C++23) |
constexpr/*movable-box*/& operator=(const/*movable-box*/& other) | (since C++23) |
std::optional.constexpr/*copyable-box*/& operator=(/*copyable-box*/&& other) | (until C++23) |
constexpr/*movable-box*/& operator=(/*movable-box*/&& other) | (since C++23) |
std::optional. constructs theoptional object(public member function of std::optional<T>)[edit] | |
| destroys the contained value, if there is one (public member function of std::optional<T>)[edit] | |
| assigns contents (public member function of std::optional<T>)[edit] | |
Observers | |
| accesses the contained value (public member function of std::optional<T>)[edit] | |
| checks whether the object contains a value (public member function of std::optional<T>)[edit] | |
Modifiers | |
| destroys any contained value (public member function of std::optional<T>)[edit] | |
| constructs the contained value in-place (public member function of std::optional<T>)[edit] | |
Acopyable-box(until C++23)movable-box(since C++23) does not contain a value only if
T does not modelmovable orcopyable, and an exception is thrown on move assignment or copy assignment respectively, orBeforeP2325R3, the wrapper was calledsemiregular-box in the standard and always satisfiedsemiregular, as the default constructor was always provided (which might construct a valueless wrapper).
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges | 201911L | (C++20) | Ranges library andconstrained algorithms |
202106L | (C++20) (DR) | Non-default-initializableviews | |
202207L | (C++23) | Relaxingrange adaptors to allow for move-only types |
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| P2325R3 | C++20 | ifT is notdefault_initializable, the default constructorconstructs a wrapper which does not contain a value | the wrapper is also not default_initializable |
| LWG 3572 | C++20 | conditionally different assignment operators were not constexpr | made constexpr |
aview that contains a single element of a specified value(class template)(customization point object)[edit] | |
aview consisting of a generated sequence by repeatedly producing the same value(class template)(customization point object)[edit] | |
aview that consists of the elements of arange that satisfies a predicate(class template)(range adaptor object)[edit] | |
aview of a sequence that applies a transformation function to each element(class template)(range adaptor object)[edit] | |
aview consisting of the initial elements of anotherview, until the first element on which a predicate returnsfalse(class template)(range adaptor object)[edit] | |
aview consisting of the elements of anotherview, skipping the initial subsequence of elements until the first element where the predicate returnsfalse(class template)(range adaptor object)[edit] | |
aview consisting of results of application of a transformation function to corresponding elements of the adapted views(class template)(customization point object)[edit] | |
aview consisting of results of application of a transformation function to adjacent elements of the adapted view(class template)(range adaptor object)[edit] |