C++ named requirements: MoveInsertable (since C++11)
Especifica que un objeto del tipo puede ser construido en almacenamiento no inicializado a partir de un rvalue de ese tipo mediante un asignador dado.
Contenidos |
Requisitos
Dados los siguientes tipos, valores y expresiones:
| Tipo | Definición |
T
|
un tipo de objeto |
A
|
un tipo de asignador |
X
|
un tipo de contenedor que satisface todas las siguientes condiciones:
|
| Valor | Definición |
| m |
un lvalue de tipo
A
|
| p |
un puntero de tipo
T*
|
| Expresión | Definición |
| rv |
una expresión que denota un rvalue de tipo
T
|
| expr | std:: allocator_traits < A > :: construct ( m, p, rv ) |
T
es
MoveInsertable
en
X
si se cumplen todas las siguientes condiciones:
- expr está bien formado.
- Inmediatamente después de la evaluación de expr , el valor de * p es equivalente al valor de rv antes de la evaluación.
Notas
Si
A
es
std::
allocator
<
T
>
, entonces esto llamará a placement
new
, como por
::
new
(
(
void
*
)
p
)
T
(
rv
)
(hasta C++20)
std::
construct_at
(
p, rv
)
(desde C++20)
. Esto efectivamente requiere que
T
sea move constructible.
Si se utiliza
std::
allocator
<
T
>
o un asignador similar, una clase no necesita implementar un
move constructor
para cumplir con este requisito de tipo: un
copy constructor
que tome un argumento
const
T
&
puede enlazar expresiones rvalue. Si una clase
MoveInsertable
implementa un move constructor, también puede implementar
move semantics
para aprovechar el hecho de que el valor de
rv
después de la construcción no está especificado.
Aunque se requería que se utilizara un
construct
personalizado al construir elementos de
std::basic_string
hasta C++23, todas las implementaciones solo utilizaron el mecanismo predeterminado. El requisito se corrigió mediante
P1072R10
para ajustarse a la práctica existente.
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2177 | C++11 | la evaluación de expr no tenía ninguna postcondición | añadida |
Véase también
| CopyInsertable |