Namespaces
Variants

std:: semiregular

From cppreference.net
Défini dans l'en-tête <concepts>
template < class T >
concept semiregular = std:: copyable < T > && std:: default_initializable < T > ;
(depuis C++20)

Le concept semiregular spécifie qu'un type est à la fois copiable et constructible par défaut. Il est satisfait par les types qui se comportent de manière similaire aux types intégrés comme int , sauf qu'ils ne nécessitent pas de prendre en charge la comparaison avec == .

Exemple

#include <concepts>
#include <iostream>
template<std::semiregular T>
// Crédit Alexander Stepanov
// les concepts sont des exigences sur T
// Exigence sur T : T est semiregular
// T a(b); ou T a = b; => constructeur de copie
// T a; => constructeur par défaut
// a = b; => assignation
struct Single
{
    T value;
    // L'initialisation par agrégation pour Single se comporte comme le constructeur suivant :
    // explicit Single(const T& x) : value(x) {}
    // Les fonctions membres spéciales déclarées implicitement se comportent comme les définitions suivantes,
    // sauf qu'elles peuvent avoir des propriétés supplémentaires :
    // Single(const Single& x) : value(x.value) {}
    // Single() {}
    // ~Single() {}
    // Single& operator=(const Single& x) { value = x.value; return *this; }
    // l'opérateur de comparaison n'est pas défini ; il n'est pas requis par le concept `semiregular`
    // bool operator==(Single const& other) const = delete;
};
void print(std::semiregular auto x)
{
    std::cout << x.value << '\n';
}
int main()
{
    Single<int> myInt1{4};      // initialisation par agrégation : myInt1.value = 4
    Single<int> myInt2(myInt1); // constructeur de copie
    Single<int> myInt3;         // constructeur par défaut
    myInt3 = myInt2;            // opérateur d'assignation par copie
//  myInt1 == myInt2;           // Erreur : operator== n'est pas défini
    print(myInt1); // ok : Single<int> est un type `semiregular`
    print(myInt2);
    print(myInt3);
}   // Les variables Single<int> sont détruites ici

Sortie :

4
4
4

Références

  • Norme C++23 (ISO/CEI 14882:2024) :
  • 18.6 Concepts d'objet [concepts.object]
  • Norme C++20 (ISO/CEI 14882:2020) :
  • 18.6 Concepts d'objet [concepts.object]

Voir aussi

(C++20)
spécifie qu'un type est régulier, c'est-à-dire qu'il est à la fois semiregular et equality_comparable
(concept)