Namespaces
Variants

C++ named requirements: CopyConstructible

From cppreference.net
C++ named requirements

Especifica que una instancia del tipo puede ser construida por copia desde una expresión lvalue .

Contenidos

Requisitos

El tipo T satisface CopyConstructible si

Dado

  • v , una expresión lvalue de tipo T o const T o una expresión rvalue de tipo const T ,
  • u , un identificador arbitrario.

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

Expresión Postcondiciones
T u = v ; El valor de u es equivalente al valor de v .

El valor de v permanece sin cambios.

T ( v ) El valor de T ( v ) es equivalente al valor de v .

El valor de v permanece sin cambios.

La expresión v.~T ( ) también debe ser válida, y, para lvalue v , la expresión & v debe tener el tipo T* o const T * y debe evaluarse a la dirección de v .

(hasta C++11)

Notas

Hasta C++11, las clases que sobrecargaban operator & no eran CopyConstructible y por lo tanto no podían usarse en los contenedores de la biblioteca estándar . Esta fue una decisión de diseño en C++98 (en lugar de un defecto, ver LWG issue 390 ).

Desde C++11, la biblioteca estándar utiliza std::addressof siempre que se necesita la dirección de un objeto.

Contenido extendido

Ser una clase CopyConstructible implica std::is_copy_constructible pero no viceversa, ya que std::is_copy_constructible solo verificará la capacidad de llamar al constructor con los argumentos correctos, y, por ejemplo, no un MoveConstructible requirement.

#include <type_traits>
#include <utility>
struct S
{
    S() = default;
    S(S&&) = delete;
    S(const S&) = default;
};
static_assert(std::is_copy_constructible_v<S>);
int main()
{
    S s1;
    // Class `S` doesn't satisfy MoveConstructible requirement,
    // hence doesn't satisfy CopyConstructible requirement
    [[maybe_unused]] S s2{std::move(s1)}; // ill-formed, use of deleted function
}

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 tiene un constructor de copia
(plantilla de clase)
especifica que un objeto de un tipo puede ser construido por copia y construido por movimiento
(concepto)