Requisitos denominados de C++: CopyInsertable (desde C++11)
Especifica que un objeto del tipo puede construirse por copia en el sitio por un asignador de memoria dado.
Requisitos
Dados los siguientes tipos, valores y expresiones:
| Tipo | Definición |
T
|
un tipo objeto |
A
|
un tipo asignador de memoria |
X
|
un tipo contenedor que satisface todas las siguientes condiciones:
|
| Valor | Definición |
m
|
un l-valor de tipo A
|
p
|
un puntero de tipo T*
|
| Expresión | Definición |
v
|
una expresión que denota un l-valor de tipo T / const T, o un r-valor de tipo const T
|
expr
|
std::allocator_traits<A>::construct(m, p, v)
|
T es CopyInsertable en X si se satisfacen todas las condiciones siguientes:
Tes MoveInsertable eX.exprestá bien formado.- La evaluación de
exprno cambia el valor dev. - Inmediatamente después de la evaluación de
expr, el valor deves equivalente a*p.
Notas
Si A es std::allocator<T>, entonces esto llamará a new de ubicación, como si fuera por ::new((void*)p) T(v) (hasta C++20)std::construct_at(p, v) (desde C++20).
Si bien hasta C++23 se requería que se utilizara una implementación de construct personalizada al construir elementos de std::basic_string, todas las implementaciones solo usaban el mecanismo por defecto. El requisito se corrige mediante P1072R10 para que coincida con la práctica existente.
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 |
|---|---|---|---|
| LWG 2177 | C++11 | la evaluación de expr no tenía ninguna condición posterior
|
añadida |
| LWG 3957 | C++11 | v podía denotar un r-valor de tipo T
|
excluido |