Semiregular wrapper (C++20)
template<class T> requires std::CopyConstructible<T> && std::is_object_v<T> class /*semiregular*/; | (since C++20) |
ranges::single_view
, ranges::filter_view
and ranges::transform_view
are specified in terms of an exposition-only class template semiregular
. The name semiregular
is for exposition purposes only and not normative.
semiregular<T>
behaves exactly like std::optional<T>
with a little differences, which makes it model Semiregular
.
Template parameters
T | - | the type of the value to manage initialization state for. The type must be a object type and model CopyConstructible |
Member functions
Following member functions are conditionally different from corresponding member functions of std::optional
.
semiregular::semiregular
constexpr semiregular() noexcept(std::is_nothrow_default_constructible_v<T>); |
If T
models DefaultConstructible
, the default constructor of semiregular<T>
constructs a semiregular wrapper containing a value-initialized T
and is equivalent to:
constexpr semiregular() noexcept(std::is_nothrow_default_constructible_v<T>) : semiregular{std::in_place} { }
Otherwise, the default constructor is equivalent to the default constructor of std::optional
and constructs a semiregular wrapper which does not contain a value.
semiregular::operator=
semiregular& operator=(const semiregular& other) noexcept(std::is_nothrow_copy_constructible_v<T>) | (1) | |
semiregular& operator=(semiregular&& other) noexcept(std::is_nothrow_move_constructible_v<T>) | (2) |
Assignable<T&, const T&>
is not satisfied, the copy assignment operator's body is equivalent to if (other) emplace(*other); else reset(); return *this;
.Otherwise, the copy assignment operator is identical to the copy assignment operator of
std::optional
.Assignable<T&, T>
is not satisfied, the move assignment operator's body is equivalent to if (other) emplace(std::move(*other)); else reset(); return *this;
.Otherwise, the move assignment operator is identical to the move assignment operator of
std::optional
.
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/cpp/ranges/semiregular_wrapper