Spec-Zone.ru › C++

Именованные требования C++: MoveInsertable (начиная с C++11)

Указывает, что объект типа может быть сконструирован в неинициализированном хранилище из rvalue этого типа с помощью заданного аллокатора.

Требования

Для следующих типов, значений и выражений:

Тип Определение
T тип объекта
A тип аллокатора
X тип контейнера, удовлетворяющий всем следующим условиям:
  • X::value_type совпадает с T.
  • X::allocator_type совпадает с std::allocator_traits<A>::rebind_alloc<T>.
Значение Определение
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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API