C++ named requirements: CopyInsertable (since C++11)
Указывает, что объект данного типа может быть скопирован на месте с помощью заданного аллокатора.
Требования
Даны следующие типы, значения и выражения:
| Тип | Определение |
T
|
тип объекта |
A
|
тип аллокатора |
X
|
тип контейнера, удовлетворяющий всем следующим условиям:
|
| Значение | Определение |
| m |
lvalue типа
A
|
| p |
указатель типа
T*
|
| Выражение | Определение |
| v |
выражение, обозначающее lvalue типа
T
/
const
T
, или rvalue типа
const
T
|
| expr | std:: allocator_traits < A > :: construct ( m, p, v ) |
T
является
CopyInsertable
в
X
, если выполняются все следующие условия:
-
Tявляется MoveInsertable вX. - expr корректно сформировано.
- Вычисление expr не изменяет значение v .
- Сразу после вычисления expr значение v эквивалентно * p .
Примечания
Если
A
является
std::
allocator
<
T
>
, тогда будет вызван placement
new
, как в
::
new
(
(
void
*
)
p
)
T
(
v
)
(до C++20)
std::
construct_at
(
p, v
)
(начиная с C++20)
.
Хотя до C++23 требовалось использовать пользовательский
construct
при конструировании элементов
std::basic_string
, все реализации использовали только механизм по умолчанию. Требование исправлено
P1072R10
для соответствия существующей практике.
Отчёты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2177 | C++11 | evaluting expr did not have any postcondition | added |
| LWG 3957 | C++11 |
v
could denote an rvalue of type
T
|
excluded |
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 2177 | C++11 | вычисление expr не имело никакого постусловия | добавлено |
| LWG 3957 | C++11 |
v
могло обозначать rvalue типа
T
|
исключено |