Namensräume
Varianten
Aktionen

std::tuple<Types...>::operator=

Von cppreference.com
< cpp‎ | utility‎ | tuple
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
tuple& operator=( const tuple& other );
(1) (seit C++11)
(constexpr seit C++20)
constexpr const tuple& operator=( const tuple& other ) const;
(2) (seit C++23)
tuple& operator=( tuple&& other ) noexcept(/* siehe unten */);
(3) (seit C++11)
(constexpr seit C++20)
constexpr const tuple& operator=( tuple&& other ) const;
(4) (seit C++23)
template< class... UTypes >
tuple& operator=( const tuple<UTypes...>& other );
(5) (seit C++11)
(constexpr seit C++20)
template< class... UTypes >
constexpr const tuple& operator=( const tuple<UTypes...>& other ) const;
(6) (seit C++23)
template< class... UTypes >
tuple& operator=( tuple<UTypes...>&& other );
(7) (seit C++11)
(constexpr seit C++20)
template< class... UTypes >
constexpr const tuple& operator=( tuple<UTypes...>&& other ) const;
(8) (seit C++23)
template< class E1, class E2 >
tuple& operator=( const std::pair<E1, E2>& p );
(9) (seit C++11)
(constexpr seit C++20)
template< class E1, class E2 >
constexpr const tuple& operator=( const std::pair<E1, E2>& p ) const;
(10) (seit C++23)
template< class E1, class E2 >
tuple& operator=( std::pair<E1, E2>&& p );
(11) (seit C++11)
(constexpr seit C++20)
template< class E1, class E2 >
constexpr const tuple& operator=( std::pair<E1, E2>&& p ) const;
(12) (seit C++23)
template< tuple-like UTuple >
constexpr tuple& operator=( UTuple&& u );
(13) (seit C++23)
template< tuple-like UTuple >
constexpr const tuple& operator=( UTuple&& u ) const;
(14) (seit C++23)

Ersetzt den Inhalt des Tupels durch den Inhalt eines anderen Tupel-ähnlichen Objekts.

In den folgenden Beschreibungen sei

  • i ein Index im Bereich [0sizeof...(Types)),
  • Ti der i-te Typ im Klassen-Template-Parameterpack Types und
  • Ui der i-te Typ in einem Funktions-Template-Parameterpack namens UTypes,

wobei die Indizierung bei Null beginnt.

1) Zuweisungsoperator durch Kopie. Weist jedes Element von other dem entsprechenden Element von *this zu.
Diese Überladung ist als gelöscht definiert, es sei denn, std::is_copy_assignable<Ti>::value ist true für alle Ti.
2) Zuweisungsoperator durch Kopie für einen qualifizierten konstanten Operanden. Weist jedes Element von other dem entsprechenden Element von *this zu.
Diese Überladung nimmt nur an der Overload-Auflösung teil, wenn std::is_copy_assignable_v<const Ti> für alle Ti true ist.
3) Zuweisungsoperator durch Verschieben. Für alle i wird std::forward<Ti>(std::get<i>(other)) dem std::get<i>(*this) zugewiesen.
Diese Überladung nimmt nur an der Overload-Auflösung teil, wenn std::is_move_assignable<Ti>::value für alle Ti true ist.
4) Zuweisungsoperator durch Verschieben für einen qualifizierten konstanten Operanden. Für alle i wird std::forward<Ti>(std::get<i>(other)) dem std::get<i>(*this) zugewiesen.
Diese Überladung nimmt nur an der Overload-Auflösung teil, wenn std::is_assignable_v<const Ti&, Ti> für alle Ti true ist.
5) Für alle i wird std::get<i>(other) dem std::get<i>(*this) zugewiesen.
Diese Überladung nimmt nur an der Overload-Auflösung teil, wenn sizeof...(Types) == sizeof...(UTypes) und std::is_assignable<Ti&, const Ui&>::value für alle entsprechenden Typenpaare Ti und Ui true ist.
6) Für alle i wird std::get<i>(other) dem std::get<i>(*this) zugewiesen.
Diese Überladung nimmt nur an der Overload-Auflösung teil, wenn sizeof...(Types) == sizeof...(UTypes) und std::is_assignable_v<const Ti&, const Ui&> für alle entsprechenden Typenpaare Ti und Ui true ist.
7) Für alle i wird std::forward<Ui>(std::get<i>(other)) dem std::get<i>(*this) zugewiesen.
Diese Überladung nimmt nur an der Overload-Auflösung teil, wenn sizeof...(Types) == sizeof...(UTypes) und std::is_assignable<Ti&, Ui>::value für alle entsprechenden Typenpaare Ti und Ui true ist.
8) Für alle i wird std::forward<Ui>(std::get<i>(other)) dem std::get<i>(*this) zugewiesen.
Diese Überladung nimmt nur an der Overload-Auflösung teil, wenn sizeof...(Types) == sizeof...(UTypes) und std::is_assignable_v<const Ti&, Ui> für alle entsprechenden Typenpaare Ti und Ui true ist.
9) Weist p.first dem ersten Element von *this und p.second dem zweiten Element von *this zu.
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn
10) Weist p.first dem ersten und p.second dem zweiten Element zu.
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn
11) Weist std::forward<E1>(p.first) dem ersten und std::forward<E2>(p.second) dem zweiten Element von *this zu.
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn
12) Weist std::forward<E1>(p.first) dem ersten und std::forward<E2>(p.second) dem zweiten Element zu.
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn
13) Für alle i wird std::get<i>(std::forward<UTuple>(u)) dem std::get<i>(*this) zugewiesen.
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn
14) Für alle i wird std::get<i>(std::forward<UTuple>(u)) dem std::get<i>(*this) zugewiesen.
Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn

Inhalt

[bearbeiten] Parameter

Sonstiges - Tupel, dessen Inhalt dieses Tupel ersetzen soll
p - Paar, dessen Inhalt dieses 2-Tupel ersetzen soll
u - Tupel-ähnliches Objekt, dessen Inhalt dieses Tupel ersetzen soll

[bearbeiten] Rückgabewert

*this

[bearbeiten] Ausnahmen

1,2) Kann implementierungsdefinierte Ausnahmen auslösen, wenn die Zuweisung eines der Typen in Types eine Ausnahme auslöst.
3)
noexcept-Spezifikation:  
noexcept(

    std::is_nothrow_move_assignable<T0>::value &&
    std::is_nothrow_move_assignable<T1>::value &&
    std::is_nothrow_move_assignable<T2>::value &&
    ...

)
4-14) Kann implementierungsdefinierte Ausnahmen auslösen, wenn die Zuweisung eines der Typen in Types eine Ausnahme auslöst.

[bearbeiten] Beispiel

#include <iostream>
#include <string>
#include <string_view>
#include <tuple>
#include <utility>
#include <vector>
 
// helper function to print std::vector<int>
std::ostream& operator<<(std::ostream& os, std::vector<int> const& v)
{
    os << '{';
    for (std::size_t t = 0; t != v.size(); ++t)
        os << v[t] << (t + 1 < v.size() ? ", " : "");
    return os << '}';
}
 
// helpers to print a tuple of any size
template<class... Args>
void print_tuple(std::string_view name, const std::tuple<Args...>& t)
{
    std::cout << name << " = {";
    std::apply([&](auto&& arg, auto&&... args)
    {
        std::cout << arg;
        ((std::cout << ", " << args), ...);
    }, t);
    std::cout << '}';
}
 
template<class Tuple1, class Tuple2>
void print_tuples(std::string_view name1, const Tuple1& t1,
                  std::string_view name2, const Tuple2& t2)
{
    print_tuple(name1, t1);
    std::cout << ", ";
    print_tuple(name2, std::tuple(t2));
    std::cout << "\n\n";
}
 
int main()
{
    // Tuple to tuple examples //
    std::tuple<int, std::string, std::vector<int>>
        t1{1, "alpha", {1, 2, 3}},
        t2{2, "beta", {4, 5}};
    print_tuples("1) t1", t1, "t2", t2);
 
    // Normal copy assignment
    // operator=( const tuple& other );
    t1 = t2;
    print_tuples("2) t1 = t2;\n   t1", t1, "t2", t2);
 
    // Normal move assignment
    // operator=( tuple&& other );
    t1 = std::move(t2);
    print_tuples("3) t1 = std::move(t2);\n   t1", t1, "t2", t2);
 
    // Converting copy assignment
    // operator=( const tuple<UTypes...>& other );
    std::tuple<short, const char*, std::vector<int>> t3{3, "gamma", {6, 7, 8}};
    t1 = t3;
    print_tuples("4) t1 = t3;\n   t1", t1, "t3", t3);
 
    // Converting move assignment
    // operator=( tuple<UTypes...>&& other );
    t1 = std::move(t3);
    print_tuples("5) t1 = std::move(t3);\n   t1", t1, "t3", t3);
 
    // Pair to tuple examples //
    std::tuple<std::string, std::vector<int>> t4{"delta", {10, 11, 12}};
    std::pair<const char*, std::vector<int>> p1{"epsilon", {14, 15, 16}};
    print_tuples("6) t4", t4, "p1", p1);
 
    // Converting copy assignment from std::pair
    // operator=( const std::pair<U1, U2>& p );
    t4 = p1;
    print_tuples("7) t4 = p1;\n   t4", t4, "p1", p1);
 
    // Converting move assignment from std::pair
    // operator=( std::pair<U1, U2>&& p );
    t4 = std::move(p1);
    print_tuples("8) t4 = std::move(p1);\n   t4", t4, "p1", p1);
}

Mögliche Ausgabe

1) t1 = {1, alpha, {1, 2, 3}}, t2 = {2, beta, {4, 5}}
 
2) t1 = t2;
   t1 = {2, beta, {4, 5}}, t2 = {2, beta, {4, 5}}
 
3) t1 = std::move(t2);
   t1 = {2, beta, {4, 5}}, t2 = {2, , {}}
 
4) t1 = t3;
   t1 = {3, gamma, {6, 7, 8}}, t3 = {3, gamma, {6, 7, 8}}
 
5) t1 = std::move(t3);
   t1 = {3, gamma, {6, 7, 8}}, t3 = {3, gamma, {}}
 
6) t4 = {delta, {10, 11, 12}}, p1 = {epsilon, {14, 15, 16}}
 
7) t4 = p1;
   t4 = {epsilon, {14, 15, 16}}, p1 = {epsilon, {14, 15, 16}}
 
8) t4 = std::move(p1);
   t4 = {epsilon, {14, 15, 16}}, p1 = {epsilon, {}}

[bearbeiten] Fehlerberichte

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 2729 C++11 operator= war unbeschränkt und könnte
zu unnötigem undefiniertem Verhalten führen
eingeschränkt

[bearbeiten] Siehe auch

konstruiert ein neues tuple
(public member function) [bearbeiten]
weist den Inhalt zu
(Member-Funktion von std::pair<T1,T2>) [bearbeiten]