C++ named requirements: CopyInsertable (since C++11)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Especifica que un objeto del tipo puede ser construido por copia in-situ por un asignador dado.
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 |
| v |
una expresión que denota un lvalue de tipo
T
/
const
T
, o un rvalue de tipo
const
T
|
| expr | std:: allocator_traits < A > :: construct ( m, p, v ) |
T
es
CopyInsertable
en
X
si se cumplen todas las siguientes condiciones:
-
Tes MoveInsertable enX. - expr está bien formado.
- Evaluar expr no cambia el valor de v .
- Inmediatamente después de evaluar expr , el valor de v es equivalente a * p .
Notas
Si
A
es
std::
allocator
<
T
>
, entonces esto llamará a placement
new
, como por
::
new
(
(
void
*
)
p
)
T
(
v
)
(hasta C++20)
std::
construct_at
(
p, v
)
(desde C++20)
.
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 | evaluar expr no tenía ninguna postcondición | añadida |
| LWG 3957 | C++11 |
v
podría denotar un rvalue de tipo
T
|
excluido |