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
Diesen Code ausführen
#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) |