Envoltorio copiable (C++20) - cppreference.com
Espacios de nombres
Variantes

Envoltorio copiable (C++20)

De cppreference.com
 
 
Biblioteca de rangos
Adaptadores de rangos
 
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

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=

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)
1) Si 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; }

De lo contrario, es idéntico a el operador de asignación de copia de std::optional.
2) Si 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; }

De lo contrario, es idéntico a el operador de asignación de movimiento de std::optional.

Miembros identicos a std::optional

Funciones miembro

Construye el objeto opcional.
(función miembro pública de std::optional<T>) [editar]
Destruye el valor contenido, si es que lo hay.
(función miembro pública de std::optional<T>) [editar]
Asigna contenido.
(función miembro pública de std::optional<T>) [editar]
Observadores
Accede al valor contenido.
(función miembro pública de std::optional<T>) [editar]
Comprueba si un objeto opcional contiene un valor.
(función miembro pública de std::optional<T>) [editar]
Modificadores
Destruye cualquier valor contenido.
(función miembro pública de std::optional<T>) [editar]
Construye el valor contenido en el sitio.
(función miembro pública de std::optional<T>) [editar]

Notas

Un objeto copyable-box no contiene un valor solo si

  • T no modela movable o copyable, 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 defecto
construye un contenedor que no contiene un valor.
El envoltorio tampoco es
default_initializable.
LWG 3572 C++20 Los operadores de asignación condicionalmente diferentes no eran constexpr. Se hicieron constexpr.

Véase también