Namespaces
Variants

std:: semiregular

From cppreference.net
Definiert in Header <concepts>
template < class T >
concept semiregular = std:: copyable < T > && std:: default_initializable < T > ;
(seit C++20)

Das semiregular -Konzept spezifiziert, dass ein Typ sowohl kopierbar als auch standardkonstruierbar ist. Es wird von Typen erfüllt, die sich ähnlich wie eingebaute Typen wie int verhalten, mit der Ausnahme, dass sie keinen Vergleich mit == unterstützen müssen.

Beispiel

#include <concepts>
#include <iostream>
template<std::semiregular T>
// Credit Alexander Stepanov
// concepts sind Anforderungen an T
// Anforderung an T: T ist semiregular
// T a(b); oder T a = b; => Kopierkonstruktor
// T a; => Standardkonstruktor
// a = b; => Zuweisung
struct Single
{
    T value;
    // Aggregatinitialisierung für Single verhält sich wie folgender Konstruktor:
    // explicit Single(const T& x) : value(x) {}
    // Implizit deklarierte spezielle Elementfunktionen verhalten sich wie folgende Definitionen,
    // außer dass sie zusätzliche Eigenschaften haben können:
    // Single(const Single& x) : value(x.value) {}
    // Single() {}
    // ~Single() {}
    // Single& operator=(const Single& x) { value = x.value; return *this; }
    // Vergleichsoperator ist nicht definiert; er wird vom `semiregular` Konzept nicht verlangt
    // bool operator==(Single const& other) const = delete;
};
void print(std::semiregular auto x)
{
    std::cout << x.value << '\n';
}
int main()
{
    Single<int> myInt1{4};      // Aggregatinitialisierung: myInt1.value = 4
    Single<int> myInt2(myInt1); // Kopierkonstruktor
    Single<int> myInt3;         // Standardkonstruktor
    myInt3 = myInt2;            // Kopierzuweisungsoperator
//  myInt1 == myInt2;           // Fehler: operator== ist nicht definiert
    print(myInt1); // ok: Single<int> ist ein `semiregular` Typ
    print(myInt2);
    print(myInt3);
}   // Single<int> Variablen werden hier zerstört

Ausgabe:

4
4
4

Referenzen

  • C++23-Standard (ISO/IEC 14882:2024):
  • 18.6 Objektkonzepte [concepts.object]
  • C++20-Standard (ISO/IEC 14882:2020):
  • 18.6 Objektkonzepte [concepts.object]

Siehe auch

(C++20)
spezifiziert, dass ein Typ regulär ist, das heißt, er ist sowohl semiregular als auch equality_comparable
(Konzept)