Namespaces
Variants

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

From cppreference.net
C++ named requirements

Especifica que una instancia del tipo puede ser construida a partir de un argumento rvalue .

Contenidos

Requisitos

El tipo T satisface MoveConstructible si

Dado

  • rv , una expresión rvalue de tipo T ,
  • u , un identificador arbitrario.

Las siguientes expresiones deben ser válidas y tener sus efectos especificados.

Expresión Postcondiciones
T u = rv ; El valor de u es equivalente al valor de rv antes de la inicialización.

El nuevo valor de rv no está especificado.

T ( rv ) El valor de T(rv) es equivalente al valor de rv antes de la inicialización.

El nuevo valor de rv no está especificado.

Notas

Una clase no tiene que implementar un move constructor para satisfacer este requisito de tipo: un copy constructor que toma un argumento const T& puede enlazar expresiones rvalue.

Si una clase MoveConstructible implementa un constructor de movimiento, también puede implementar semánticas de movimiento para aprovechar el hecho de que el valor de rv después de la construcción no está especificado.

Contenido extendido

Ser una clase MoveConstructible implica std::is_move_constructible pero no viceversa, ya que std::is_move_constructible solo verificará la capacidad de llamar al constructor con los argumentos correctos, no un valor de postcondición.

#include <iostream>
struct S
{
    int n;
    S(int in) : n{in} {}
    S(S&& other) { n = other.n + 1; }
};
static_assert(std::is_move_constructible_v<S>);
int main()
{
    S v{1};
    std::cout << "v.n = " << v.n << '\n';
    S u = std::move(v);
    // La clase `S` no satisface el requisito MoveConstructible
    // El valor de `u` NO es equivalente al valor de `v` antes de la inicialización de `u`
    std::cout << "u.n = " << u.n << '\n';
}

Salida:

v.n = 1
u.n = 2

Referencias

Contenido extendido
  • Estándar C++23 (ISO/IEC 14882:2024):
  • 16.4.4.2 Requisitos de argumentos de plantilla [utility.arg.requirements]

Véase también

verifica si un tipo puede ser construido desde una referencia a valor temporal
(plantilla de clase)
especifica que un objeto de un tipo puede ser construido por movimiento
(concepto)