Assignable wrapper (C++20)
|
template
<
class
T
>
requires
std::
copy_constructible
<
T
>
&&
std::
is_object_v
<
T
>
|
(начиная с C++20)
(до C++23) ( только для демонстрации* ) |
|
|
template
<
class
T
>
requires
std::
move_constructible
<
T
>
&&
std::
is_object_v
<
T
>
|
(начиная с C++23)
( только для демонстрации* ) |
|
ranges::single_view
,
ranges::repeat_view
,
(начиная с C++23)
и адаптеры диапазонов, которые хранят вызываемый объект, определяются с использованием только демонстрационного шаблона класса
copyable-box
(до C++23)
movable-box
(начиная с C++23)
. Показанное здесь имя используется только в демонстрационных целях.
Обёртка ведёт себя точно так же, как
std::
optional
<
T
>
, за исключением того, что конструктор по умолчанию, оператор копирующего присваивания и оператор перемещающего присваивания (условно) отличаются от таковых у
std::optional
, что дополняет
T
возможностью присваивания при необходимости и делает его всегда удовлетворяющим требованиям
copyable
или
movable
(начиная с C++23)
.
|
Если
|
(до C++23) |
|
Если
/*movable-box*/
<
T
>
может хранить только объект
|
(начиная с C++23) |
Содержание |
Параметры шаблона
| T | - |
тип содержащегося значения, должен быть объектным типом, который моделирует
copy_constructible
(until C++23)
move_constructible
(since C++23)
|
Функции-члены
Конструктор по умолчанию
|
constexpr
/*copyable-box*/
(
)
noexcept
(
std::
is_nothrow_default_constructible_v
<
T
>
)
requires
std::
default_initializable
<
T
>
|
(since C++20)
(until C++23) |
|
|
constexpr
/*movable-box*/
(
)
noexcept
(
std::
is_nothrow_default_constructible_v
<
T
>
)
requires
std::
default_initializable
<
T
>
|
(since C++23) | |
Конструктор по умолчанию предоставляется тогда и только тогда, когда
T
моделирует
default_initializable
.
Обёртка, созданная конструктором по умолчанию, содержит значение-инициализированный объект
T
.
Операторы присваивания
| (1) | ||
|
constexpr
/*copyable-box*/
&
operator
=
(
const
/*copyable-box*/
&
other
)
;
noexcept ( /* см. ниже */ ) ; |
(начиная с C++20)
(до C++23) |
|
|
constexpr
/*movable-box*/
&
operator
=
(
const
/*movable-box*/
&
other
)
;
noexcept ( /* см. ниже */ ) requires std:: copy_constructible < T > ; |
(начиная с C++23) | |
| (2) | ||
|
constexpr
/*copyable-box*/
&
operator
=
(
/*copyable-box*/
&&
other
)
noexcept ( std:: is_nothrow_move_constructible_v < T > ) ; |
(начиная с C++20)
(до C++23) |
|
|
constexpr
/*movable-box*/
&
operator
=
(
/*movable-box*/
&&
other
)
noexcept ( std:: is_nothrow_move_constructible_v < T > ) ; |
(начиная с C++23) | |
|
constexpr
/*copyable-box*/
&
operator
=
(
const
/*copyable-box*/
&
other
)
|
(до C++23) |
|
constexpr
/*movable-box*/
&
operator
=
(
const
/*movable-box*/
&
other
)
|
(начиная с C++23) |
std::optional
.
|
constexpr
/*copyable-box*/
&
operator
=
(
/*copyable-box*/
&&
other
)
|
(до C++23) |
|
constexpr
/*movable-box*/
&
operator
=
(
/*movable-box*/
&&
other
)
|
(начиная с C++23) |
std::optional
.
Члены, идентичные std:: optional
Функции-члены
создает объект
optional
(публичная функция-член
std::optional<T>
)
|
|
|
уничтожает содержащееся значение, если оно есть
(публичная функция-член
std::optional<T>
)
|
|
|
присваивает содержимое
(публичная функция-член
std::optional<T>
)
|
|
Наблюдатели |
|
|
обращается к содержащемуся значению
(публичная функция-член
std::optional<T>
)
|
|
|
проверяет, содержит ли объект значение
(публичная функция-член
std::optional<T>
)
|
|
Модификаторы |
|
|
уничтожает любое содержащееся значение
(публичная функция-член
std::optional<T>
)
|
|
|
создает содержащееся значение на месте
(публичная функция-член
std::optional<T>
)
|
|
Примечания
A
copyable-box
(until C++23)
movable-box
(since C++23)
не содержит значения только если
-
Tне моделируетmovableилиcopyable, и при перемещающем присваивании или копирующем присваивании соответственно выбрасывается исключение, или - он инициализируется/присваивается из другого пустого обёрточного объекта.
До
P2325R3
обёртка называлась
semiregular-box
в стандарте и всегда удовлетворяла
semiregular
, так как конструктор по умолчанию всегда предоставлялся (который мог создавать обёртку без значения).
| Макрос тестирования возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_ranges
|
201911L
|
(C++20) | Библиотека диапазонов и ограниченные алгоритмы |
202106L
|
(C++20)
(DR) |
Не- инициализируемые по умолчанию представления | |
202207L
|
(C++23) | Ослабление требований для адаптеров диапазонов для поддержки типов только с перемещением |
Отчёты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| P2325R3 | C++20 |
если
T
не является
default_initializable
, конструктор по умолчанию
создаёт обёртку, которая не содержит значения |
обёртка также
не является
default_initializable
|
| LWG 3572 | C++20 | условно различные операторы присваивания не были constexpr | сделаны constexpr |
Смотрите также
|
представление, которое содержит один элемент указанного значения
(шаблон класса) (объект точки кастомизации) |
|
|
представление, состоящее из сгенерированной последовательности путем повторного создания одного и того же значения
(шаблон класса) (объект точки кастомизации) |
|
представление, которое состоит из элементов
range
, удовлетворяющих предикату
(шаблон класса) (объект адаптера диапазона) |
|
|
представление последовательности, которое применяет функцию преобразования к каждому элементу
(шаблон класса) (объект адаптера диапазона) |
|
представление, состоящее из начальных элементов другого
view
, до первого элемента, на котором предикат возвращает
false
(шаблон класса) (объект адаптера диапазона) |
|
представление, состоящее из элементов другого
view
, пропускающее начальную подпоследовательность элементов до первого элемента, где предикат возвращает
false
(шаблон класса) (объект адаптера диапазона) |
|
|
представление, состоящее из результатов применения функции преобразования к соответствующим элементам адаптированных представлений
(шаблон класса) (объект точки кастомизации) |
|
|
представление, состоящее из результатов применения функции преобразования к смежным элементам адаптированного представления
(шаблон класса) (объект адаптера диапазона) |