Namespaces
Variants

Standard library header <concepts> (C++20)

From cppreference.net
Standard library headers

Este encabezado es parte de la biblioteca de concepts .

Contenidos

Conceptos

Conceptos fundamentales del lenguaje
(C++20)
especifica que un tipo es el mismo que otro tipo
(concept)
especifica que un tipo es derivado de otro tipo
(concept)
especifica que un tipo es implícitamente convertible a otro tipo
(concept)
especifica que dos tipos comparten un tipo de referencia común
(concept)
especifica que dos tipos comparten un tipo común
(concept)
(C++20)
especifica que un tipo es un tipo integral
(concept)
especifica que un tipo es un tipo integral con signo
(concept)
especifica que un tipo es un tipo integral que es sin signo
(concept)
especifica que un tipo es un tipo de punto flotante
(concept)
especifica que un tipo puede ser asignado desde otro tipo
(concept)
especifica que un tipo puede ser intercambiado o que dos tipos pueden ser intercambiados entre sí
(concept)
especifica que un objeto del tipo puede ser destruido
(concept)
especifica que una variable del tipo puede ser construida desde o enlazada a un conjunto de tipos de argumentos
(concepto)
especifica que un objeto de un tipo puede ser construido por defecto
(concept)
especifica que un objeto de un tipo puede ser construido por movimiento
(concept)
especifica que un objeto de un tipo puede ser copiado y movido mediante construcción
(concept)
Conceptos de comparación
especifica que el operador == es una relación de equivalencia
(concepto)
especifica que los operadores de comparación en el tipo producen un orden total
(concept)
Conceptos de objeto
(C++20)
especifica que un objeto de un tipo puede ser movido e intercambiado
(concept)
(C++20)
especifica que un objeto de un tipo puede ser copiado, movido e intercambiado
(concept)
especifica que un objeto de un tipo puede ser copiado, movido, intercambiado y construido por defecto
(concept)
(C++20)
especifica que un tipo es regular, es decir, es tanto semiregular como equality_comparable
(concepto)
Conceptos invocables
especifica que un tipo invocable puede ser invocado con un conjunto dado de tipos de argumentos
(concept)
(C++20)
especifica que un tipo invocable es un predicado booleano
(concept)
(C++20)
especifica que un tipo invocable es una relación binaria
(concept)
especifica que una relation impone una relación de equivalencia
(concept)
especifica que una relation impone un ordenamiento estricto débil
(concepto)

Objetos de punto de personalización

intercambia los valores de dos objetos
(objeto de punto de personalización)

Sinopsis

// todos independientes
namespace std {
  // conceptos relacionados con el lenguaje
  // concepto same_as
  template<class T, class U>
  concept same_as = /* ver descripción */;
  // concepto derived_from
  template<class Derived, class Base>
  concept derived_from = /* ver descripción */;
  // concepto convertible_to
  template<class From, class To>
  concept convertible_to = /* ver descripción */;
  // concepto common_reference_with
  template<class T, class U>
  concept common_reference_with = /* ver descripción */;
  // concepto common_with
  template<class T, class U>
  concept common_with = /* ver descripción */;
  // conceptos aritméticos
  template<class T>
  concept integral = /* ver descripción */;
  template<class T>
  concept signed_integral = /* ver descripción */;
  template<class T>
  concept unsigned_integral = /* ver descripción */;
  template<class T>
  concept floating_point = /* ver descripción */;
  // concepto assignable_from
  template<class LHS, class RHS>
  concept assignable_from = /* ver descripción */;
  // concepto swappable
  namespace ranges {
    inline namespace /* no especificado */ {
      inline constexpr /* no especificado */ swap = /* no especificado */;
    }
  }
  template<class T>
  concept swappable = /* ver descripción */;
  template<class T, class U>
  concept swappable_with = /* ver descripción */;
  // concepto destructible
  template<class T>
  concept destructible = /* ver descripción */;
  // concepto constructible_from
  template<class T, class... Args>
  concept constructible_from = /* ver descripción */;
  // concepto default_initializable
  template<class T>
  concept default_initializable = /* ver descripción */;
  // concepto move_constructible
  template<class T>
  concept move_constructible = /* ver descripción */;
  // concepto copy_constructible
  template<class T>
  concept copy_constructible = /* ver descripción */;
  // conceptos de comparación
  // concepto equality_comparable
  template<class T>
  concept equality_comparable = /* ver descripción */;
  template<class T, class U>
  concept equality_comparable_with = /* ver descripción */;
  // concepto totally_ordered
  template<class T>
  concept totally_ordered = /* ver descripción */;
  template<class T, class U>
  concept totally_ordered_with = /* ver descripción */;
  // conceptos de objeto
  template<class T>
  concept movable = /* ver descripción */;
  template<class T>
  concept copyable = /* ver descripción */;
  template<class T>
  concept semiregular = /* ver descripción */;
  template<class T>
  concept regular = /* ver descripción */;
  // conceptos invocables
  // concepto invocable
  template<class F, class... Args>
  concept invocable = /* ver descripción */;
  // concepto regular_invocable
  template<class F, class... Args>
  concept regular_invocable = /* ver descripción */;
  // concepto predicate
  template<class F, class... Args>
  concept predicate = /* ver descripción */;
  // concepto relation
  template<class R, class T, class U>
  concept relation = /* ver descripción */;
  // concepto equivalence_relation
  template<class R, class T, class U>
  concept equivalence_relation = /* ver descripción */;
  // concepto strict_weak_order
  template<class R, class T, class U>
  concept strict_weak_order = /* ver descripción */;
}

Concepto auxiliar boolean-testable

template<class T>
concept /*boolean-testable-impl*/ = convertible_to<T, bool>; // solo para exposición;
template<class T>
concept boolean-testable = // solo para exposición
  /*boolean-testable-impl*/<T> && requires(T&& t) {
    {
      !std::forward<T>(t)
    } -> /*boolean-testable-impl*/;
  };

Concepto same_as

template<class T, class U>
concept /*same-as-impl*/ = is_same_v<T, U>; // solo para exposición
template<class T, class U>
concept same_as = /*same-as-impl*/<T, U> && /*same-as-impl*/<U, T>;

Concepto derived_from

template<class Derived, class Base>
concept derived_from = is_base_of_v<Base, Derived> &&
                       is_convertible_v<const volatile Derived*, const volatile Base*>;

Concepto convertible_to

template<class From, class To>
concept convertible_to =
  is_convertible_v<From, To> && requires { static_cast<To>(declval<From>()); };

Concepto common_reference_with

template<class T, class U>
concept common_reference_with =
  same_as<common_reference_t<T, U>, common_reference_t<U, T>> &&
  convertible_to<T, common_reference_t<T, U>> &&
  convertible_to<U, common_reference_t<T, U>>;

Concepto common_with

template<class T, class U>
concept common_with =
  same_as<common_type_t<T, U>, common_type_t<U, T>> &&
  requires {
    static_cast<common_type_t<T, U>>(declval<T>());
    static_cast<common_type_t<T, U>>(declval<U>());
  } &&
  common_reference_with<add_lvalue_reference_t<const T>,
                        add_lvalue_reference_t<const U>> &&
  common_reference_with<
    add_lvalue_reference_t<common_type_t<T, U>>,
    common_reference_t<add_lvalue_reference_t<const T>, add_lvalue_reference_t<const U>>>;

Concepto integral

template<class T>
concept integral = is_integral_v<T>;

Concepto signed_integral

template<class T>
concept signed_integral = integral<T> && is_signed_v<T>;

Concepto unsigned_integral

template<class T>
concept unsigned_integral = integral<T> && !signed_integral<T>;

Concepto floating_point

template<class T>
concept floating_point = is_floating_point_v<T>;

Concepto assignable_from

template<class LHS, class RHS>
concept assignable_from =
  is_lvalue_reference_v<LHS> &&
  common_reference_with<const remove_reference_t<LHS>&, const remove_reference_t<RHS>&> &&
  requires(LHS lhs, RHS&& rhs) {
    {
      lhs = std::forward<RHS>(rhs)
    } -> same_as<LHS>;
  };

Concepto swappable

template<class T>
concept swappable = requires(T& a, T& b) { ranges::swap(a, b); };

Concepto swappable_with

template<class T, class U>
concept swappable_with = common_reference_with<T, U> && requires(T&& t, U&& u) {
  ranges::swap(std::forward<T>(t), std::forward<T>(t));
  ranges::swap(std::forward<U>(u), std::forward<U>(u));
  ranges::swap(std::forward<T>(t), std::forward<U>(u));
  ranges::swap(std::forward<U>(u), std::forward<T>(t));
};

Concepto destructible

template<class T>
concept destructible = is_nothrow_destructible_v<T>;

Concepto constructible_from

template<class T, class... Args>
concept constructible_from = destructible<T> && is_constructible_v<T, Args...>;

Concept default_initializable

template<class T>
constexpr bool /*is-default-initializable*/ = /* ver descripción */; // solo para exposición
template<class T>
concept default_initializable =
  constructible_from<T> && requires { T{}; } && /*is-default-initializable*/<T>;

Concepto move_constructible

template<class T>
concept move_constructible = constructible_from<T, T> && convertible_to<T, T>;

Concepto copy_constructible

template<class T>
concept copy_constructible =
  move_constructible<T> && constructible_from<T, T&> && convertible_to<T&, T> &&
  constructible_from<T, const T&> && convertible_to<const T&, T> &&
  constructible_from<T, const T> && convertible_to<const T, T>;

Concepto equality_comparable

template<class T, class U>
concept /*weakly-equality-comparable-with*/ = // solo para exposición
  requires(const remove_reference_t<T>& t, const remove_reference_t<U>& u) {
    { t == u } -> boolean-testable;
    { t != u } -> boolean-testable;
    { u == t } -> boolean-testable;
    { u != t } -> boolean-testable;
  };
template<class T>
concept equality_comparable = /*weakly-equality-comparable-with*/<T, T>;

Concepto equality_comparable_with

template<class T, class U, class C = common_reference_t<const T&, const U&>>
concept /*comparison-common-type-with-impl*/ = // solo para exposición
  same_as<common_reference_t<const T&, const U&>,
          common_reference_t<const U&, const T&>> &&
  requires {
    requires convertible_to<const T&, const C&> || convertible_to<T, const C&>;
    requires convertible_to<const U&, const C&> || convertible_to<U, const C&>;
  };
template<class T, class U>
concept /*comparison-common-type-with*/ = // solo para exposición
  /*comparison-common-type-with-impl*/<remove_cvref_t<T>, remove_cvref_t<U>>;
template<class T, class U>
concept equality_comparable_with =
  equality_comparable<T> && equality_comparable<U> &&
  /*comparison-common-type-with*/<T, U> &&
  equality_comparable<
    common_reference_t<const remove_reference_t<T>&, const remove_reference_t<U>&>> &&
  /*weakly-equality-comparable-with*/<T, U>;

Concepto auxiliar partially-ordered-with

Definido en el encabezado <compare>

template<class T, class U>
concept /*parcialmente-ordenado-con*/ = // solo para exposición
  requires(const remove_reference_t<T>& t, const remove_reference_t<U>& u) {
    { t <  u } -> boolean-testable;
    { t >  u } -> boolean-testable;
    { t <= u } -> boolean-testable;
    { t >= u } -> boolean-testable;
    { u <  t } -> boolean-testable;
    { u >  t } -> boolean-testable;
    { u <= t } -> boolean-testable;
    { u >= t } -> boolean-testable;
  };

Concepto totally_ordered

template<class T>
concept totalmente_ordenado = equality_comparable<T> && /*partially-ordered-with*/<T, T>;

Concepto totally_ordered_with

template<class T, class U>
concept totalmente_ordenado_con =
  totalmente_ordenado<T> && totalmente_ordenado<U> && comparable_en_igualdad_con<T, U> &&
  totalmente_ordenado<
    tipo_referencia_comun<const eliminar_referencia_t<T>&, const eliminar_referencia_t<U>&>> &&
  /*parcialmente-ordenado-con*/<T, U>;

Concepto movable

template<class T>
concept movable =
  is_object_v<T> && move_constructible<T> && assignable_from<T&, T> && swappable<T>;

Concepto copyable

template<class T>
concept copiable = copy_constructible<T> && movable<T> && assignable_from<T&, T&> &&
                   assignable_from<T&, const T&> && assignable_from<T&, const T>;

Concepto semiregular

template<class T>
concept semiregular = copyable<T> && default_initializable<T>;

Concepto regular

template<class T>
concept regular = semiregular<T> && equality_comparable<T>;

Concepto invocable

template<class F, class... Args>
concept invocable = requires(F&& f, Args&&... args) {
  invoke(std::forward<F>(f),
         std::forward<Args>(args)...); // no se requiere que preserve la igualdad
};

Concepto regular_invocable

template<class F, class... Args>
  concept regular_invocable = invocable<F, Args...>;

Concepto predicate

template<class F, class... Args>
concept predicado =
  invocable_regular<F, Args...> && boolean-testable<invoke_result_t<F, Args...>>;

Concepto relation

template<class R, class T, class U>
concept relación =
  predicate<R, T, T> && predicate<R, U, U> && predicate<R, T, U> && predicate<R, U, T>;

Concepto equivalence_relation

template<class R, class T, class U>
concept equivalence_relation = relation<R, T, U>;

Concepto strict_weak_order

template<class R, class T, class U>
concept strict_weak_order = relation<R, T, U>;