Namensräume
Varianten
Aktionen

std::uses_allocator_construction_args

Von cppreference.com
< cpp‎ | memory
 
 
Speicherverwaltungsbibliothek
(nur Exposition*)
Algorithmen für uninitialisierten Speicher
(C++17)
(C++17)
(C++17)
Beschränkte uninitialisierte
Speicher-Algorithmen
C-Bibliothek

Allocatoren
uses_allocator_construction_args
(C++20)
Speicherressourcen
Unterstützung für Garbage Collection
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
(C++11)(bis C++23)
Uninitialisierter Speicher
Explizites Lebenszeitmanagement
 
Definiert in Header <memory>
T ist keine Spezialisierung von std::pair
template< class T, class Alloc, class... Args >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    Args&&... args ) noexcept;
(1) (seit C++20)
T ist eine Spezialisierung von std::pair
template< class T, class Alloc, class Tuple1, class Tuple2 >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    std::piecewise_construct_t, Tuple1&& x, Tuple2&& y ) noexcept;
(2) (seit C++20)
template< class T, class Alloc >
constexpr auto uses_allocator_construction_args( const Alloc& alloc ) noexcept;
(3) (seit C++20)
template< class T, class Alloc, class U, class V >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    U&& u, V&& v ) noexcept;
(4) (seit C++20)
template< class T, class Alloc, class U, class V >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    std::pair<U, V>& pr ) noexcept;
(5) (seit C++23)
template< class T, class Alloc, class U, class V >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    const std::pair<U, V>& pr ) noexcept;
(6) (seit C++20)
template< class T, class Alloc, class U, class V >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    std::pair<U, V>&& pr ) noexcept;
(7) (seit C++20)
template< class T, class Alloc, class U, class V >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    const std::pair<U, V>&& pr ) noexcept;
(8) (seit C++23)
template< class T, class Alloc, class NonPair >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    NonPair&& non_pair ) noexcept;
(9) (seit C++20)

Bereitet die Argumentenliste vor, die zum Erstellen eines Objekts des gegebenen Typs T mittels Uses-Allocator-Konstruktion benötigt wird.

1) Dieser Überladungsfall nimmt nur an der Overload Resolution teil, wenn T keine Spezialisierung von std::pair ist. Gibt ein std::tuple zurück, das wie folgt ermittelt wird:
2) Dieser Überladungsfall nimmt nur an der Overload Resolution teil, wenn T eine Spezialisierung von std::pair ist. Für T, das std::pair<T1, T2> ist, äquivalent zu
return std::make_tuple(std::piecewise_construct,
    std::apply([&alloc](auto&&... args1)
        {
            return std::uses_allocator_construction_args<T1>(alloc,
                       std::forward<decltype(args1)>(args1)...);
        }, std::forward<Tuple1>(x)
    ),
    std::apply([&alloc](auto&&... args2)
        {
            return std::uses_allocator_construction_args<T2>(alloc,
                       std::forward<decltype(args2)>(args2)...);
        }, std::forward<Tuple2>(y)
    )
);
3) Dieser Überladungsfall nimmt nur an der Overload Resolution teil, wenn T eine Spezialisierung von std::pair ist. Äquivalent zu
return std::uses_allocator_construction_args<T>(alloc,
    std::piecewise_construct, std::tuple<>{}, std::tuple<>{}
);
4) Dieser Überladungsfall nimmt nur an der Overload Resolution teil, wenn T eine Spezialisierung von std::pair ist. Äquivalent zu
return std::uses_allocator_construction_args<T>(alloc,
    std::piecewise_construct,
    std::forward_as_tuple(std::forward<U>(u)),
    std::forward_as_tuple(std::forward<V>(v))
);
5,6) Dieser Überladungsfall nimmt nur an der Overload Resolution teil, wenn T eine Spezialisierung von std::pair ist. Äquivalent zu
return std::uses_allocator_construction_args<T>(alloc,
    std::piecewise_construct,
    std::forward_as_tuple(pr.first),
    std::forward_as_tuple(pr.second)
);
7,8) Dieser Überladungsfall nimmt nur an der Overload Resolution teil, wenn T eine Spezialisierung von std::pair ist. Äquivalent zu
return std::uses_allocator_construction_args<T>(alloc,
    std::piecewise_construct,
    std::forward_as_tuple(std::get<0>(std::move(pr))),
    std::forward_as_tuple(std::get<1>(std::move(pr)))
);
9) Dieser Überladungsfall nimmt nur an der Overload Resolution teil, wenn T eine Spezialisierung von std::pair ist, und gegeben der expositions-nur Funktion Template
template<class A, class B>
void /*deduce-as-pair*/(const std::pair<A, B>&);

, /*deduce-as-pair*/(non_pair) ist fehlerhaft, wenn als unevaluierter Operand betrachtet.
Sei die expositions-nur Klasse pair-constructor definiert als

class /*pair-constructor*/
{
    const Alloc& alloc_; // exposition only
    NonPair&     u_;     // exposition only
 
    constexpr reconstruct(const std::remove_cv<T>& p) const // exposition only
    {
        return std::make_obj_using_allocator<std::remove_cv<T>>(alloc_, p);
    }
 
    constexpr reconstruct(std::remove_cv<T>&& p) const // exposition only
    {
        return std::make_obj_using_allocator<std::remove_cv<T>>(alloc_, std::move(p));
    }
 
public:
    constexpr operator std::remove_cv<T>() const
    {
        return reconstruct(std::forward<NonPair>(u_));
    }
};
Dieser Überladungsfall ist äquivalent zu return std::make_tuple(pair_construction);, wobei pair_construction ein Wert vom Typ pair-constructor ist, dessen alloc_ und u_ Mitglieder alloc und non_pair sind.

Inhalt

[bearbeiten] Parameter

alloc - der zu verwendende Allokator
args - die Argumente, die an den Konstruktor von T übergeben werden sollen
x - Tupel von Argumenten, die an die Konstruktoren des first-Datenmembers von T übergeben werden sollen
y - Tupel von Argumenten, die an die Konstruktoren des second-Datenmembers von T übergeben werden sollen
u - einzelnes Argument, das an den Konstruktor des first-Datenmembers von T übergeben werden soll
v - einzelnes Argument, das an den Konstruktor des second-Datenmembers von T übergeben werden soll
pr - ein Paar, dessen first-Datenmember an den Konstruktor des first-Datenmembers von T übergeben wird und dessen second-Datenmember an den Konstruktor des second-Datenmembers von T übergeben wird
non_pair - einzelnes Argument, das in ein std::pair für die weitere Konstruktion konvertiert wird

[bearbeiten] Rückgabewert

std::tuple von Argumenten, die geeignet sind, an den Konstruktor von T übergeben zu werden.

[bearbeiten] Hinweise

Die Überladungen (2-9) stellen die Weitergabe von Allocator an std::pair bereit, das weder die Leading-Allocator- noch die Trailing-Allocator-Aufrufkonventionen unterstützt (im Gegensatz zu z. B. std::tuple, das die Leading-Allocator-Konvention verwendet).

Bei der Verwendung in der Uses-Allocator-Konstruktion konvertiert die Konvertierungsfunktion von pair-constructor zunächst das bereitgestellte Argument in std::pair und erstellt dann das Ergebnis aus diesem std::pair mittels Uses-Allocator-Konstruktion.

[bearbeiten] Beispiel

[bearbeiten] Fehlermeldungen

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 3525 C++20 keine Überladung konnte in Paare konvertierbare Nicht-pair-Typen behandeln Rekonstruktionsüberladung hinzugefügt

[bearbeiten] Siehe auch

prüft, ob der angegebene Typ Uses-Allocator-Konstruktion unterstützt
(Klassen-Template) [edit]
erstellt ein Objekt des gegebenen Typs mittels Uses-Allocator-Konstruktion
(Funktions-Template) [edit]
erstellt ein Objekt des gegebenen Typs an einer angegebenen Speicherstelle mittels Uses-Allocator-Konstruktion
(Funktions-Template) [edit]