Zuweisbarer Wrapper (C++20)
template< class T > erfordert std::copy_constructible<T> && std::is_object_v<T> |
(seit C++20) (bis C++23) (nur Exposition*) |
|
| template< class T > erfordert std::move_constructible<T> && std::is_object_v<T> |
(seit C++23) (nur Exposition*) |
|
ranges::single_view, ranges::repeat_view,(seit C++23) und Bereichsadapter, die ein aufrufbares Objekt speichern, werden in Bezug auf eine rein zur Darstellung dienende Klassenschablone copyable-box(bis C++23)movable-box(seit C++23) spezifiziert. Der hier gezeigte Name dient nur zu Darstellungszwecken.
Der Wrapper verhält sich exakt wie std::optional<T>, mit der Ausnahme, dass der Standardkonstruktor, der Kopierzugriffsoperator und der Verschiebungszugriffsoperator (bedingt) anders sind als die von std::optional, was T bei Bedarf um Zuweisbarkeit erweitert und es immer copyableoder movable(seit C++23) erfüllen lässt.
|
Wenn |
(bis C++23) |
|
Wenn
/*movable-box*/<T> kann nur ein |
(seit C++23) |
Inhalt |
[edit] Schablonenparameter
| T | - | der Typ des enthaltenen Wertes, muss ein Objekttyp sein, der copy_constructible(bis C++23)move_constructible(seit C++23) modelliert |
[edit] Memberfunktionen
Standardkonstruktor
constexpr /*copyable-box*/() noexcept(std::is_nothrow_default_constructible_v<T>) requires std::default_initializable<T> |
(seit C++20) (bis C++23) |
|
| constexpr /*movable-box*/() noexcept(std::is_nothrow_default_constructible_v<T>) requires std::default_initializable<T> |
(seit C++23) | |
Der Standardkonstruktor ist genau dann vorhanden, wenn T default_initializable modelliert.
Ein standardkonstruierter Wrapper enthält ein wertinitialisiertes T-Objekt.
Zuweisungsoperatoren
| (1) | ||
constexpr /*copyable-box*/& operator=(const /*copyable-box*/& other); noexcept(/* siehe unten */); |
(seit C++20) (bis C++23) |
|
| constexpr /*movable-box*/& operator=(const /*movable-box*/& other) noexcept(/* siehe unten */) requires std::copy_constructible<T>; |
(seit C++23) | |
| (2) | ||
constexpr /*copyable-box*/& operator=(/*copyable-box*/&& other) noexcept(std::is_nothrow_move_constructible_v<T>); |
(seit C++20) (bis C++23) |
|
| constexpr /*movable-box*/& operator=(/*movable-box*/&& other) noexcept(std::is_nothrow_move_constructible_v<T>); |
(seit C++23) | |
|
constexpr /*copyable-box*/& operator=(const /*copyable-box*/& other) |
(bis C++23) |
|
constexpr /*movable-box*/& operator=(const /*movable-box*/& other) |
(seit C++23) |
std::optional.|
constexpr /*copyable-box*/& operator=(/*copyable-box*/&& other) |
(bis C++23) |
|
constexpr /*movable-box*/& operator=(/*movable-box*/&& other) |
(seit C++23) |
std::optional.[edit] Anmerkungen
Ein copyable-box(bis C++23)movable-box(seit C++23) enthält nur dann keinen Wert, wenn
-
Tnichtmovableodercopyablemodelliert und bei der Verschiebung bzw. dem Kopieren eine Ausnahme ausgelöst wird, oder - er aus einem anderen wertlosen Wrapper initialisiert/zugewiesen wird.
Vor P2325R3 hieß der Wrapper im Standard semiregular-box und erfüllte immer semiregular, da der Standardkonstruktor immer vorhanden war (was einen wertlosen Wrapper konstruieren konnte).
| Feature-Test-Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_ranges |
201911L |
(C++20) | Bereichsbibliothek und eingeschränkte Algorithmen |
202106L |
(C++20) (DR) |
Nicht standardmäßig initialisierbare Views | |
202207L |
(C++23) | Lockern von Bereichsadaptern, um zeigerlose Typen zu ermöglichen |
[edit] Berichte über Mängel
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| P2325R3 | C++20 | wenn T nicht default_initializable ist, konstruiert der Standardkonstruktoreinen Wrapper, der keinen Wert enthält |
der Wrapper ist auch nicht default_initializable |
| LWG 3572 | C++20 | bedingt unterschiedliche Zuweisungsoperatoren waren nicht constexpr | machten constexpr |
[edit] Siehe auch
eine view, die ein einzelnes Element eines bestimmten Wertes enthält(class template) (customization point object) | |
ein view, der eine Sequenz aus der wiederholten Erzeugung desselben Werts besteht(Klassen-Template) (Customization Point Objekt) | |
ein view, der aus den Elementen eines range besteht, die ein Prädikat erfüllen(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view einer Sequenz, der eine Transformationsfunktion auf jedes Element anwendet(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view, der aus den anfänglichen Elementen eines anderen view besteht, bis zum ersten Element, für das ein Prädikat false zurückgibt(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view, der aus den Elementen eines anderen view besteht, wobei die anfängliche Teilsequenz von Elementen übersprungen wird, bis zum ersten Element, bei dem das Prädikat false zurückgibt(Klassen-Template) (Range-Adaptor-Objekt) | |
ein view, der aus den Ergebnissen der Anwendung einer Transformationsfunktion auf entsprechende Elemente der adaptierten Views besteht(Klassen-Template) (Customization Point Objekt) | |
ein view, der aus den Ergebnissen der Anwendung einer Transformationsfunktion auf benachbarte Elemente des adaptierten Views besteht(Klassen-Template) (Range-Adaptor-Objekt) |