Namensräume
Varianten
Aktionen

Zuweisbarer Wrapper (C++20)

Von cppreference.com
< cpp‎ | ranges
 
 
Bereichsbibliothek
Range-Adaptoren
Hilfselemente
copyable-box
movable-box
(bis C++23)  (C++23)


 
template< class T >

    erfordert std::copy_constructible<T> && std::is_object_v<T>

class /*copyable-box*/;
(seit C++20)
(bis C++23)
(nur Exposition*)
template< class T >

    erfordert std::move_constructible<T> && std::is_object_v<T>

class /*movable-box*/;
(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 T bereits copyable ist, oder wenn sowohl std::is_nothrow_move_constructible_v<T> als auch std::is_nothrow_copy_constructible_v<T> true sind, kann /*copyable-box*/<T> nur ein T-Objekt speichern, da es immer einen Wert enthält.

(bis C++23)

Wenn T

/*movable-box*/<T> kann nur ein T-Objekt speichern, da es immer einen Wert enthält.

(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>

    : /*copyable-box*/(std::in_place) { }
(seit C++20)
(bis C++23)
constexpr /*movable-box*/() noexcept(std::is_nothrow_default_constructible_v<T>)

    requires std::default_initializable<T>

    : /*movable-box*/(std::in_place) { }
(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)
1) Wenn std::copyable<T> nicht modelliert wird, wird der Kopierzugriffsoperator äquivalent wie folgt definiert:

constexpr /*copyable-box*/& operator=(const /*copyable-box*/& other)
    noexcept(std::is_nothrow_copy_constructible_v<T>)
{
    if (this != std::addressof(other))
        if (other)
            emplace(*other);
        else
            reset();

    return *this;
}

(bis C++23)

constexpr /*movable-box*/& operator=(const /*movable-box*/& other)
    noexcept(std::is_nothrow_copy_constructible_v<T>)
    requires std::copy_constructible<T>
{
    if (this != std::addressof(other))
        if (other)
            emplace(*other);
        else
            reset();

    return *this;
}

(seit C++23)
Andernfalls ist er identisch mit dem Kopierzugriffsoperator von std::optional.
2) Wenn std::movable<T> nicht modelliert wird, wird der Verschiebungszugriffsoperator äquivalent wie folgt definiert:

constexpr /*copyable-box*/& operator=(/*copyable-box*/&& other)
    noexcept(std::is_nothrow_move_constructible_v<T>)
{
    if (this != std::addressof(other))
        if (other)
            emplace(std::move(*other));
        else
            reset();

    return *this;
}

(bis C++23)

constexpr /*movable-box*/& operator=(/*movable-box*/&& other)
    noexcept(std::is_nothrow_move_constructible_v<T>)
{
    if (this != std::addressof(other))
        if (other)
            emplace(std::move(*other));
        else
            reset();

    return *this;
}

(seit C++23)
Andernfalls ist er identisch mit dem Verschiebungszugriffsoperator von std::optional.

Mit std::optional identische Member

Memberfunktionen

konstruiert das optional-Objekt
(public member function of std::optional<T>) [edit]
zerstört den enthaltenen Wert, falls vorhanden
(public member function of std::optional<T>) [edit]
weist Inhalte zu
(public member function of std::optional<T>) [edit]
Observer
greift auf den enthaltenen Wert zu
(public member function of std::optional<T>) [edit]
prüft, ob das Objekt einen Wert enthält
(public member function of std::optional<T>) [edit]
Modifizierer
zerstört jeden enthaltenen Wert
(public member function of std::optional<T>) [edit]
konstruiert den enthaltenen Wert in-place
(public member function of std::optional<T>) [edit]

[edit] Anmerkungen

Ein copyable-box(bis C++23)movable-box(seit C++23) enthält nur dann keinen Wert, wenn

  • T nicht movable oder copyable modelliert 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 Standardkonstruktor
einen 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)[edit]
ein view, der eine Sequenz aus der wiederholten Erzeugung desselben Werts besteht
(Klassen-Template) (Customization Point Objekt)[edit]
ein view, der aus den Elementen eines range besteht, die ein Prädikat erfüllen
(Klassen-Template) (Range-Adaptor-Objekt)[edit]
ein view einer Sequenz, der eine Transformationsfunktion auf jedes Element anwendet
(Klassen-Template) (Range-Adaptor-Objekt)[edit]
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)[edit]
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)[edit]
ein view, der aus den Ergebnissen der Anwendung einer Transformationsfunktion auf entsprechende Elemente der adaptierten Views besteht
(Klassen-Template) (Customization Point Objekt)[edit]
ein view, der aus den Ergebnissen der Anwendung einer Transformationsfunktion auf benachbarte Elemente des adaptierten Views besteht
(Klassen-Template) (Range-Adaptor-Objekt)[edit]