Spec-Zone.ru › C++

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

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

Требования

Тип T является MoveInsertable в контейнер X, чьей value_type идентична T, если, учитывая

A тип аллокатора
m lvalue типа A
p указатель типа T*, подготовленный контейнером
rv rvalue выражение типа T

где X::allocator_type идентична std::allocator_traits<A>::rebind_alloc<T>,

следующее выражение является корректным:

std::allocator_traits<A>::construct(m, p, rv);

И после оценки, значение *p эквивалентно значению, ранее содержавшемуся в rv (rv остаётся валидным, но находится в неопределённом состоянии).

Если X не является aware-аллокатором или является специализацией std::basic_string, термин определяется как если бы A было std::allocator<T>, за исключением того, что не нужно создавать объект аллокатора, и пользовательские специализации std::allocator не инициализируются.

Примечания

Если A является std::allocator<T>, то это вызовет размещающее создание нового объекта, как и в ::new((void*)p) T(rv)(до C++20)std::construct_at(p, rv)(с C++20). Это фактически требует, чтобы T обладал move-конструктором.

Если используется std::allocator<T> или аналогичный аллокатор, классу не нужно реализовывать move-конструктор для удовлетворения этого требования: копирующий конструктор, принимающий const T& аргумент, может связывать rvalue-выражения. Если класс MoveInsertable реализует move-конструктор, он также может реализовать move-семантику для использования того факта, что значение rv после конструирования неопределено.

Хотя требуется использование настраиваемого construct при создании элементов std::basic_string до C++23, все реализации использовали только механизм по умолчанию. Это требование исправлено в P1072R10 для соответствия существующей практике.

См. также

CopyInsertable

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/named_req/MoveInsertable

Spec-Zone.ru

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