Envoltorio copiable (C++20)
template<class T> requires std::copy_constructible<T> && std::is_object_v<T> class /*copyable-box*/; |
(desde C++20) | |
ranges::single_view y los adaptadores de rango que almacenan un objeto invocable se especifican en términos de una plantilla de clase solo de exposición copyable-box (envoltorio copiable). El nombre copyable-box es solo para fines de exposición.
/*copyable-box*/<T> se comporta exactamente como std::optional<T>, excepto que el constructor por defecto, el operador de asignación de copia y el operador de asignación de movimiento son (condicionalmente) diferentes de los de std::optional, lo que hace que siempre satisfaga copyable.
Si T ya es copyable, o tanto std::is_nothrow_move_constructible_v<T> como std::is_nothrow_copy_constructible_v<T> son true, /*copyable-box*/<T> solo puede almacenar un objeto T, ya que siempre contiene un valor.
Parámetros de plantilla
| T | - | El tipo del valor contenido, debe ser un tipo objeto que modele copy_constructible.
|
Funciones miembro
copyable-box::copyable-box
<tbody> </tbody> constexpr /*copyable-box*/() noexcept(std::is_nothrow_default_constructible_v<T>) requires std::default_initializable<T> : /*copyable-box*/(std::in_place) { } |
(desde C++20) | |
El constructor por defecto se proporciona si y solo si T modela default_initializable.
Un objeto /*copyable-box*/<T> construido por defecto contiene un objeto T inicializado por valor.
copyable-box::operator=
<tbody> </tbody> constexpr /*copyable-box*/& operator=(const /*copyable-box*/& other); noexcept(/* véase a continuación */); |
(1) | (desde C++20) |
constexpr /*copyable-box*/& operator=(/*copyable-box*/&& other) noexcept(std::is_nothrow_move_constructible_v<T>); |
(2) | (desde C++20) |
std::copyable<T> no está modelado, el operador de asignación de copia se define de manera equivalente como:
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; }
std::optional.std::movable<T> no está modelado, el operador de asignación de movimiento se define de manera equivalente como:
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; }
std::optional.Notas
Un objeto copyable-box no contiene un valor solo si
Tno modelamovableocopyable, y se genera una excepción en la asignación de movimiento o la asignación de copia respectivamente, o- se inicializa/asigna desde otro envoltorio sin valor.
Antes de P2325R3, el contenedor se llamaba semiregular-box en el estándar y siempre cumplía con semiregular, ya que siempre se proporcionaba el constructor por defecto (que podría construir un envoltorio sin valor).
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| P2325R3 | C++20 | Si T no es default_initializable, el constructor por defectoconstruye un contenedor que no contiene un valor. |
El envoltorio tampoco esdefault_initializable.
|
| LWG 3572 | C++20 | Los operadores de asignación condicionalmente diferentes no eran constexpr.
|
Se hicieron constexpr.
|
Véase también
Una vista (view) que contiene un solo elemento de un valor específico. (plantilla de clase) (objeto punto de personalización) | |
Una vista (view) que consiste en los elementos de un rango (range) que satisface un predicado. (plantilla de clase) (objeto adaptador de rango) | |
Una vista (view) de una secuencia que aplica una función de transformación a cada elemento. (plantilla de clase) (objeto adaptador de rango) | |
Una vista (view) que consiste en los elementos iniciales de otra vista, hasta el primer elemento sobre el que un predicado devuelva falso. (plantilla de clase) (objeto adaptador de rango) | |
Una vista (view) que consiste en los elementos de otra vista, saltándose la subsecuencia inicial de elementos hasta el primer elemento donde el predicado devuelva falso. (plantilla de clase) (objeto adaptador de rango) | |
Una vista (view) que consiste en tuplas del resultado de aplicar una función de transformación a los elementos correspondientes de las vistas adaptadas. (plantilla de clase) (objeto punto de personalización) | |
| Una vista (vista) que consiste en tuplas del resultado de aplicar una función de transformación a elementos adyacentes de la vista adaptada. (plantilla de clase) (objeto adaptador de rango) |