C++ named requirements: MoveInsertable (since C++11)
Указывает, что объект данного типа может быть сконструирован в неинициализированной памяти из rvalue этого типа с помощью заданного аллокатора.
Содержание |
Требования
Даны следующие типы, значения и выражения:
| Тип | Определение |
T
|
тип объекта |
A
|
тип аллокатора |
X
|
тип контейнера, удовлетворяющий всем следующим условиям:
|
| Значение | Определение |
| m |
lvalue типа
A
|
| p |
указатель типа
T*
|
| Выражение | Определение |
| rv |
выражение, обозначающее rvalue типа
T
|
| expr | std:: allocator_traits < A > :: construct ( m, p, rv ) |
T
является
MoveInsertable
в
X
, если выполняются все следующие условия:
- expr является корректным выражением.
- Сразу после вычисления expr , значение * p эквивалентно значению rv до вычисления.
Примечания
Если
A
является
std::
allocator
<
T
>
, тогда будет вызван placement
new
, как в
::
new
(
(
void
*
)
p
)
T
(
rv
)
(до C++20)
std::
construct_at
(
p, rv
)
(начиная с C++20)
. Это фактически требует, чтобы
T
был move constructible.
Если используется
std::
allocator
<
T
>
или аналогичный аллокатор, классу не требуется реализовывать
move constructor
для выполнения этого требования типа:
copy constructor
, принимающий аргумент
const
T
&
, может связывать rvalue выражения. Если класс
MoveInsertable
реализует move constructor, он также может реализовывать
move semantics
, чтобы использовать преимущество того факта, что значение
rv
после конструирования не определено.
Хотя до 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 |
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 2177 | C++11 | вычисление expr не имело никакого постусловия | добавлено |
Смотрите также
| CopyInsertable |