Именованные требования C++: MoveInsertable (начиная с 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>, будет вызван размещающий new, согласно ::new((void*)p) T(rv)(до C++20)std::construct_at(p, rv)(начиная с C++20). Фактически это требует, чтобы T был конструируем перемещением.
Если используется std::allocator<T> или аналогичный аллокатор, классу необязательно реализовывать конструктор перемещения, чтобы удовлетворять этому требованию к типу: конструктор копирования, принимающий аргумент constT&, может связываться с выражениями rvalue. Если класс, удовлетворяющий требованию MoveInsertable, реализует конструктор перемещения, он также может реализовать семантику перемещения, чтобы воспользоваться тем, что значение rv после конструирования не определено.
Хотя до C++23 требовалось использовать настроенный construct при конструировании элементов std::basic_string, все реализации использовали только механизм по умолчанию. Требование исправлено документом P1072R10, чтобы оно соответствовало существующей практике.
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроспективно к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Поведение согласно опубликованной версии | Исправленное поведение |
|---|---|---|---|
| LWG 2177 | C++11 | вычисление expr не имело постусловия | добавлено |
См. также
| CopyInsertable |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/named_req/MoveInsertable