Namespaces
Variants

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

From cppreference.net
Standard library headers

Cet en-tête fait partie de la bibliothèque concepts .

Table des matières

Concepts

Concepts fondamentaux du langage
(C++20)
spécifie qu'un type est identique à un autre type
(concept)
spécifie qu'un type est dérivé d'un autre type
(concept)
spécifie qu'un type est implicitement convertible en un autre type
(concept)
spécifie que deux types partagent un type de référence commun
(concept)
spécifie que deux types partagent un type commun
(concept)
(C++20)
spécifie qu'un type est un type intégral
(concept)
spécifie qu'un type est un type entier signé
(concept)
spécifie qu'un type est un type intégral non signé
(concept)
spécifie qu'un type est un type à virgule flottante
(concept)
spécifie qu'un type peut être assigné à partir d'un autre type
(concept)
spécifie qu'un type peut être échangé ou que deux types peuvent être échangés l'un avec l'autre
(concept)
spécifie qu'un objet du type peut être détruit
(concept)
spécifie qu'une variable du type peut être construite à partir ou liée à un ensemble de types d'arguments
(concept)
spécifie qu'un objet d'un type peut être construit par défaut
(concept)
spécifie qu'un objet d'un type peut être construit par déplacement
(concept)
spécifie qu'un objet d'un type peut être copié et déplacé par construction
(concept)
Concepts de comparaison
spécifie que l'opérateur == est une relation d'équivalence
(concept)
spécifie que les opérateurs de comparaison sur le type produisent un ordre total
(concept)
Concepts d'objet
(C++20)
spécifie qu'un objet d'un type peut être déplacé et échangé
(concept)
(C++20)
spécifie qu'un objet d'un type peut être copié, déplacé et échangé
(concept)
spécifie qu'un objet d'un type peut être copié, déplacé, échangé et construit par défaut
(concept)
(C++20)
spécifie qu'un type est régulier, c'est-à-dire qu'il est à la fois semiregular et equality_comparable
(concept)
Concepts appelables
spécifie qu'un type appelable peut être invoqué avec un ensemble donné de types d'arguments
(concept)
(C++20)
spécifie qu'un type appelable est un prédicat booléen
(concept)
(C++20)
spécifie qu'un type appelable est une relation binaire
(concept)
spécifie qu'une relation impose une relation d'équivalence
(concept)
spécifie qu'une relation impose un ordre strict faible
(concept)

Objets de point de personnalisation

échange les valeurs de deux objets
(point de personnalisation d'objet)

Synopsis

// tous freestanding
namespace std {
  // concepts liés au langage
  // concept same_as
  template<class T, class U>
  concept same_as = /* voir description */;
  // concept derived_from
  template<class Derived, class Base>
  concept derived_from = /* voir description */;
  // concept convertible_to
  template<class From, class To>
  concept convertible_to = /* voir description */;
  // concept common_reference_with
  template<class T, class U>
  concept common_reference_with = /* voir description */;
  // concept common_with
  template<class T, class U>
  concept common_with = /* voir description */;
  // concepts arithmétiques
  template<class T>
  concept integral = /* voir description */;
  template<class T>
  concept signed_integral = /* voir description */;
  template<class T>
  concept unsigned_integral = /* voir description */;
  template<class T>
  concept floating_point = /* voir description */;
  // concept assignable_from
  template<class LHS, class RHS>
  concept assignable_from = /* voir description */;
  // concept swappable
  namespace ranges {
    inline namespace /* non spécifié */ {
      inline constexpr /* non spécifié */ swap = /* non spécifié */;
    }
  }
  template<class T>
  concept swappable = /* voir description */;
  template<class T, class U>
  concept swappable_with = /* voir description */;
  // concept destructible
  template<class T>
  concept destructible = /* voir description */;
  // concept constructible_from
  template<class T, class... Args>
  concept constructible_from = /* voir description */;
  // concept default_initializable
  template<class T>
  concept default_initializable = /* voir description */;
  // concept move_constructible
  template<class T>
  concept move_constructible = /* voir description */;
  // concept copy_constructible
  template<class T>
  concept copy_constructible = /* voir description */;
  // concepts de comparaison
  // concept equality_comparable
  template<class T>
  concept equality_comparable = /* voir description */;
  template<class T, class U>
  concept equality_comparable_with = /* voir description */;
  // concept totally_ordered
  template<class T>
  concept totally_ordered = /* voir description */;
  template<class T, class U>
  concept totally_ordered_with = /* voir description */;
  // concepts d'objet
  template<class T>
  concept movable = /* voir description */;
  template<class T>
  concept copyable = /* voir description */;
  template<class T>
  concept semiregular = /* voir description */;
  template<class T>
  concept regular = /* voir description */;
  // concepts appelables
  // concept invocable
  template<class F, class... Args>
  concept invocable = /* voir description */;
  // concept regular_invocable
  template<class F, class... Args>
  concept regular_invocable = /* voir description */;
  // concept predicate
  template<class F, class... Args>
  concept predicate = /* voir description */;
  // concept relation
  template<class R, class T, class U>
  concept relation = /* voir description */;
  // concept equivalence_relation
  template<class R, class T, class U>
  concept equivalence_relation = /* voir description */;
  // concept strict_weak_order
  template<class R, class T, class U>
  concept strict_weak_order = /* voir description */;
}

Concept auxiliaire boolean-testable

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

Concept same_as

template<class T, class U>
concept /*same-as-impl*/ = is_same_v<T, U>; // exposition uniquement
template<class T, class U>
concept same_as = /*same-as-impl*/<T, U> && /*same-as-impl*/<U, T>;

Concept 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*>;

Concept convertible_to

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

Concept 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>>;
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. Le texte à traduire était uniquement constitué des instructions en anglais, qui ont été suivies pour produire cette réponse.

Concept 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>>>;

Concept integral

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

Concept signed_integral

template<class T>
concept signed_integral = integral<T> && is_signed_v<T>;
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++. Le reste du contenu textuel a été préservé tel quel, car il n'y a pas d'autre texte à traduire en dehors du code.

Concept unsigned_integral

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

Concept floating_point

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

Concept 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>;
  };
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. Seul le texte environnant (s'il y en avait) aurait été traduit en français.

Concept swappable

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

Concept 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));
};

Concept destructible

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

Concept 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 /*est-initialisable-par-défaut*/ = /* voir description */; // exposition uniquement
template<class T>
concept default_initializable =
  constructible_from<T> && requires { T{}; } && /*est-initialisable-par-défaut*/<T>;

Concept move_constructible

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

Concept 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>;

Concept equality_comparable

template<class T, class U>
concept /*weakly-equality-comparable-with*/ = // à titre d'exposition uniquement
  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>;

Concept equality_comparable_with

template<class T, class U, class C = common_reference_t<const T&, const U&>>
concept /*comparison-common-type-with-impl*/ = // exposition uniquement
  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*/ = // exposition uniquement
  /*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>;

Concept d'assistant partially-ordered-with

Défini dans l'en-tête <compare>

template<class T, class U>
concept /*partiellement-ordonné-avec*/ = // exposition uniquement
  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;
  };

Concept totally_ordered

template<class T>
concept totalement_ordonné = equality_comparable<T> && /*partiellement-ordonné-avec*/<T, T>;

Concept totally_ordered_with

template<class T, class U>
concept totalement_ordonné_avec =
  totalement_ordonné<T> && totalement_ordonné<U> && comparable_en_égalité_avec<T, U> &&
  totalement_ordonné<
    type_référence_commune_t<const supprimer_référence_t<T>&, const supprimer_référence_t<U>&>> &&
  /*partiellement-ordonné-avec*/<T, U>;

Concept movable

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

Concept 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>;

Concept semiregular

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

Concept regular

template<class T>
concept régulier = semiregular<T> && equality_comparable<T>;

Concept invocable

template<class F, class... Args>
concept invocable = requires(F&& f, Args&&... args) {
  invoke(std::forward<F>(f),
         std::forward<Args>(args)...); // non requis d'être préservateur d'égalité
};

Concept regular_invocable

template<class F, class... Args>
  concept regular_invocable = invocable<F, Args...>;
**Note:** Le code C++ n'a pas été traduit car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. Seul le texte environnant (s'il y en avait) aurait été traduit en français.

Concept predicate

template<class F, class... Args>
concept prédicat =
  invocable_régulier<F, Args...> && boolean-testable<invoke_result_t<F, Args...>>;

Concept relation

template<class R, class T, class U>
concept relation =
  predicate<R, T, T> && predicate<R, U, U> && predicate<R, T, U> && predicate<R, U, T>;
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` et contient des termes spécifiques au C++ qui doivent être préservés. Seul le texte en dehors des balises de code aurait été traduit, mais dans cet exemple, il n'y a pas de texte à traduire en dehors du code.

Concept equivalence_relation

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

Concept strict_weak_order

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