Xavier Lamorlette

C++ 20

Concepts

Les concepts sont des prédicats booléens, nommés, sur des paramètres templates, évalués à la compilation.

Exemples :

template <class T>
concept bool EqualityComparable() {
  return requires(T a, T b) {
    {a == b} -> Boolean;
    {a != b} -> Boolean;
  };
}

template <class T>
concept bool Integral() {
  return is_integral::value;
}

template <class T>
concept Equality =
  requires(T a, T b) {
    bool == {a == b}
    bool == {a != b}
  }

Fonction template contrainte par un concept :

void f(const EqualityComparable &);

Les concepts peuvent être utilisés pour la résolution de surcharge au lieu du SFINAE.

Les concepts peuvent être utilisés au lieu du susbtitut non contraint auto :

Sortable s = f(x);  // au lieu de auto s = f(x);

Les utilisations suivantes son équivalentes :

template <typename T>
requires Integral<T>()
void foo(T x) {
  …
}

template <Integral T>
void foo(T x) {
  …
}

void foo(Integral x) {
  …
}

Types Regular et SemiRegular

SemiRegular est un concept équivalent à DefaultConstructible + Destructible + CopyConstructible + CopyAssignable + MoveConstructible + MoveAssignable + Swappable.

Regular est un concept équivalent à SemiRegular + EqualityComparable.

Les containeurs et les algorithmes de la STL requièrent des types Regular.

Spaceship <=> operator

Comparaison trilatérale :

Cet opérateur doit être une relation d'ordre total (weak ordering), c'est-à-dire vérifiant (a == b || a < b || a > b) == true. == signifie ici que les éléments sont équivalents mais pas forcément identiques.

Avec une relation d'ordre strict total (strict weak ordering), == signifie que les éléments sont identiques.

Cet opérateur peut être construit automatiquement :

auto operator<=>(const A &) = default;

La dernière mise à jour de cette page date de janvier 2019.

Le contenu de ce site est, en tant qu'œuvre originale de l'esprit, protégé par le droit d'auteur.
Pour tout commentaire, vous pouvez m'écrire à xavier.lamorlette@gmail.com.