Namespaces
Variants

C++ named requirements: MoveInsertable (since C++11)

From cppreference.net
C++ named requirements

Especifica que un objeto del tipo puede ser construido en almacenamiento no inicializado a partir de un rvalue de ese tipo mediante un asignador dado.

Contenidos

Requisitos

Dados los siguientes tipos, valores y expresiones:

Tipo Definición
T un tipo de objeto
A un tipo de asignador
X un tipo de contenedor que satisface todas las siguientes condiciones:
Valor Definición
m un lvalue de tipo A
p un puntero de tipo T*
Expresión Definición
rv una expresión que denota un rvalue de tipo T
expr std:: allocator_traits < A > :: construct ( m, p, rv )

T es MoveInsertable en X si se cumplen todas las siguientes condiciones:

  • expr está bien formado.
  • Inmediatamente después de la evaluación de expr , el valor de * p es equivalente al valor de rv antes de la evaluación.

Notas

Si A es std:: allocator < T > , entonces esto llamará a placement new , como por :: new ( ( void * ) p ) T ( rv ) (hasta C++20) std:: construct_at ( p, rv ) (desde C++20) . Esto efectivamente requiere que T sea move constructible.

Si se utiliza std:: allocator < T > o un asignador similar, una clase no necesita implementar un move constructor para cumplir con este requisito de tipo: un copy constructor que tome un argumento const T & puede enlazar expresiones rvalue. Si una clase MoveInsertable implementa un move constructor, también puede implementar move semantics para aprovechar el hecho de que el valor de rv después de la construcción no está especificado.

Aunque se requería que se utilizara un construct personalizado al construir elementos de std::basic_string hasta C++23, todas las implementaciones solo utilizaron el mecanismo predeterminado. El requisito se corrigió mediante P1072R10 para ajustarse a la práctica existente.

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2177 C++11 la evaluación de expr no tenía ninguna postcondición añadida

Véase también

CopyInsertable