Assignable wrapper (C++20)
|
template
<
class
T
>
requires
std::
copy_constructible
<
T
>
&&
std::
is_object_v
<
T
>
|
(desde C++20)
(hasta C++23) ( solo para exposición* ) |
|
|
template
<
class
T
>
requires
std::
move_constructible
<
T
>
&&
std::
is_object_v
<
T
>
|
(desde C++23)
( solo para exposición* ) |
|
ranges::single_view
,
ranges::repeat_view
,
(desde C++23)
y los adaptadores de rango que almacenan un objeto invocable se especifican en términos de una plantilla de clase solo para exposición
copyable-box
(hasta C++23)
movable-box
(desde C++23)
. El nombre mostrado aquí es solo para fines de exposición.
El contenedor 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 cual aumenta
T
con capacidad de asignación cuando es necesario y hace que siempre satisfaga
copyable
o
movable
(desde C++23)
.
|
Si
|
(hasta C++23) |
|
Si
/*movable-box*/
<
T
>
puede almacenar solo un objeto
|
(desde C++23) |
Contenidos |
Parámetros de plantilla
| T | - |
el tipo del valor contenido, debe ser un tipo de objeto que modele
copy_constructible
(hasta C++23)
move_constructible
(desde C++23)
|
Funciones miembro
Constructor por defecto
|
constexpr
/*copyable-box*/
(
)
noexcept
(
std::
is_nothrow_default_constructible_v
<
T
>
)
requires
std::
default_initializable
<
T
>
|
(desde C++20)
(hasta C++23) |
|
|
constexpr
/*movable-box*/
(
)
noexcept
(
std::
is_nothrow_default_constructible_v
<
T
>
)
requires
std::
default_initializable
<
T
>
|
(desde C++23) | |
El constructor por defecto se proporciona si y solo si
T
modela
default_initializable
.
Un wrapper construido por defecto contiene un objeto
T
inicializado por valor.
Operadores de asignación
| (1) | ||
|
constexpr
/*copyable-box*/
&
operator
=
(
const
/*copyable-box*/
&
other
)
;
noexcept ( /* ver abajo */ ) ; |
(desde C++20)
(hasta C++23) |
|
|
constexpr
/*movable-box*/
&
operator
=
(
const
/*movable-box*/
&
other
)
;
noexcept ( /* ver abajo */ ) requires std:: copy_constructible < T > ; |
(desde C++23) | |
| (2) | ||
|
constexpr
/*copyable-box*/
&
operator
=
(
/*copyable-box*/
&&
other
)
noexcept ( std:: is_nothrow_move_constructible_v < T > ) ; |
(desde C++20)
(hasta C++23) |
|
|
constexpr
/*movable-box*/
&
operator
=
(
/*movable-box*/
&&
other
)
noexcept ( std:: is_nothrow_move_constructible_v < T > ) ; |
(desde C++23) | |
|
constexpr
/*copyable-box*/
&
operator
=
(
const
/*copyable-box*/
&
other
)
|
(hasta C++23) |
|
constexpr
/*movable-box*/
&
operator
=
(
const
/*movable-box*/
&
other
)
|
(desde C++23) |
std::optional
.
|
constexpr
/*copyable-box*/
&
operator
=
(
/*copyable-box*/
&&
other
)
|
(hasta C++23) |
|
constexpr
/*movable-box*/
&
operator
=
(
/*movable-box*/
&&
other
)
|
(desde C++23) |
std::optional
.
Miembros idénticos a std:: optional
Funciones miembro
construye el objeto
optional
(función miembro pública de
std::optional<T>
)
|
|
|
destruye el valor contenido, si existe
(función miembro pública de
std::optional<T>
)
|
|
|
asigna contenido
(función miembro pública de
std::optional<T>
)
|
|
Observadores |
|
|
accede al valor contenido
(función miembro pública de
std::optional<T>
)
|
|
|
comprueba si el objeto contiene un valor
(función miembro pública de
std::optional<T>
)
|
|
Modificadores |
|
|
destruye cualquier valor contenido
(función miembro pública de
std::optional<T>
)
|
|
|
construye el valor contenido in-situ
(función miembro pública de
std::optional<T>
)
|
|
Notas
Un
copyable-box
(until C++23)
movable-box
(since C++23)
no contiene un valor solo si
-
Tno modelamovableocopyable, y se lanza una excepción en la asignación de movimiento o asignación de copia respectivamente, o - se inicializa/asigna desde otro contenedor sin valor.
Antes de
P2325R3
, el contenedor se denominaba
semiregular-box
en el estándar y siempre satisfacía
semiregular
, ya que el constructor por defecto siempre se proporcionaba (lo cual podía construir un contenedor sin valor).
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_ranges
|
201911L
|
(C++20) | Biblioteca de rangos y algoritmos restringidos |
202106L
|
(C++20)
(DR) |
Vistas no inicializables por defecto | |
202207L
|
(C++23) | Relajación de adaptadores de rango para permitir tipos de solo movimiento |
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| P2325R3 | C++20 |
si
T
no es
default_initializable
, el constructor por defecto
construye un wrapper que no contiene un valor |
el wrapper 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
una
view
que contiene un único elemento de un valor especificado
(plantilla de clase) (objeto de punto de personalización) |
|
una
view
que consiste en una secuencia generada al producir repetidamente el mismo valor
(plantilla de clase) (objeto de punto de personalización) |
|
una
view
que consiste en los elementos de un
range
que satisface un predicado
(plantilla de clase) (objeto adaptador de rango) |
|
una
view
de una secuencia que aplica una función de transformación a cada elemento
(plantilla de clase) (objeto adaptador de rango) |
|
una
view
que consiste en los elementos iniciales de otra
view
, hasta el primer elemento en el que un predicado devuelve
false
(plantilla de clase) (objeto adaptador de rango) |
|
una
view
que consiste en los elementos de otra
view
, omitiendo la subsecuencia inicial de elementos hasta el primer elemento donde el predicado devuelve
false
(plantilla de clase) (objeto adaptador de rango) |
|
una
view
que consiste en los resultados de la aplicación de una función de transformación a elementos correspondientes de las vistas adaptadas
(plantilla de clase) (objeto de punto de personalización) |
|
una
view
que consiste en los resultados de la aplicación de una función de transformación a elementos adyacentes de la vista adaptada
(plantilla de clase) (objeto adaptador de rango) |