Namespaces
Variants

Assignable wrapper (C++20)

From cppreference.net
Ranges library
Range adaptors
Helper items
copyable-box
movable-box
(until C++23) (C++23)


template < class T >

requires std:: copy_constructible < T > && std:: is_object_v < T >

class /*copyable-box*/ ;
(начиная с C++20)
(до C++23)
( только для демонстрации* )
template < class T >

requires std:: move_constructible < T > && std:: is_object_v < T >

class /*movable-box*/ ;
(начиная с 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) .

Если T уже является copyable , или оба std:: is_nothrow_move_constructible_v < T > и std:: is_nothrow_copy_constructible_v < T > равны true , /*copyable-box*/ < T > может хранить только объект T , поскольку он всегда содержит значение.

(до C++23)

Если T

/*movable-box*/ < T > может хранить только объект 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 >

: /*copyable-box*/ ( std:: in_place ) { }
(since C++20)
(until C++23)
constexpr /*movable-box*/ ( ) noexcept ( std:: is_nothrow_default_constructible_v < T > )

requires std:: default_initializable < T >

: /*movable-box*/ ( std:: in_place ) { }
(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)
1) Если std:: copyable < T > не моделируется, оператор копирующего присваивания эквивалентно определяется как:

constexpr /*copyable-box*/ & operator = ( const /*copyable-box*/ & other )
noexcept ( std:: is_nothrow_copy_constructible_v < T > )
{
if ( this ! = std:: addressof ( other ) )
if ( other )
emplace ( * other ) ;
else
reset ( ) ;

return * this ;
}

(до C++23)

constexpr /*movable-box*/ & operator = ( const /*movable-box*/ & other )
noexcept ( std:: is_nothrow_copy_constructible_v < T > )
requires std:: copy_constructible < T >
{
if ( this ! = std:: addressof ( other ) )
if ( other )
emplace ( * other ) ;
else
reset ( ) ;

return * this ;
}

(начиная с C++23)
В противном случае он идентичен оператору копирующего присваивания std::optional .
2) Если std:: movable < T > не моделируется, оператор перемещающего присваивания эквивалентно определяется как:

constexpr /*copyable-box*/ & operator = ( /*copyable-box*/ && other )
noexcept ( std:: is_nothrow_move_constructible_v < T > )
{
if ( this ! = std:: addressof ( other ) )
if ( other )
emplace ( std :: move ( * other ) ) ;
else
reset ( ) ;

return * this ;
}

(до C++23)

constexpr /*movable-box*/ & operator = ( /*movable-box*/ && other )
noexcept ( std:: is_nothrow_move_constructible_v < T > )
{
if ( this ! = std:: addressof ( other ) )
if ( other )
emplace ( std :: move ( * other ) ) ;
else
reset ( ) ;

return * this ;
}

(начиная с 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
(шаблон класса) (объект адаптера диапазона)
представление, состоящее из результатов применения функции преобразования к соответствующим элементам адаптированных представлений
(шаблон класса) (объект точки кастомизации)
представление, состоящее из результатов применения функции преобразования к смежным элементам адаптированного представления
(шаблон класса) (объект адаптера диапазона)