Именованные требования C++: CopyInsertable (начиная с C++11)
Указывает, что объект типа может быть сконструирован копированием на месте с помощью заданного распределителя.
Требования
Для следующих типов, значений и выражений:
| Тип | Определение |
|---|---|
T | тип объекта |
A | тип распределителя |
X | тип контейнера, удовлетворяющий всем следующим условиям:
|
| Значение | Определение |
m | lvalue типа A |
p | указатель типа T* |
| Выражение | Определение |
v | выражение, обозначающее lvalue типа T / constT или rvalue типа constT |
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++.
| Отчёт об ошибке | Применён к | Поведение в опубликованной версии | Исправленное поведение |
|---|---|---|---|
| LWG 2177 | C++11 | вычисление expr не имело никаких постусловий | добавлено |
| LWG 3957 | C++11 |
v могло обозначать rvalue типа T | исключено |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/CopyInsertable