Namespaces
Variants

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

From cppreference.net
Utilities library
(Anmerkung: Dieser HTML-Code enthält keinen übersetzbaren Text, da alle Tags und Attribute unverändert bleiben müssen und die Zelleninhalte leer sind.)
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 tupelartigen Objekts.

In den folgenden Beschreibungen sei

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

wobei die Indizierung nullbasiert ist.

1) Kopierzuweisungsoperator. 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) Kopierzuweisungsoperator für const-qualifizierten Operanden. Weist jedes Element von other dem entsprechenden Element von * this zu.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn std:: is_copy_assignable_v < const Ti > für alle Ti true ist.
3) Move-Zuweisungsoperator. Weist für alle i den Wert std:: forward < Ti > ( std :: get < i > ( other ) ) an std :: get < i > ( * this ) zu.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn std:: is_move_assignable < Ti > :: value für alle Ti true ist.
4) Move-Zuweisungsoperator für const-qualifizierten Operanden. Weist für alle i den Wert std:: forward < Ti > ( std :: get < i > ( other ) ) an std :: get < i > ( * this ) zu.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn std:: is_assignable_v < const Ti & , Ti > für alle Ti true ist.
5) Für alle i weist std :: get < i > ( other ) zu an std :: get < i > ( * this ) .
Diese Überladung nimmt nur dann an der Überladungsauflö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) Weist für alle i den Wert std :: get < i > ( other ) an std :: get < i > ( * this ) zu.
Diese Überladung nimmt nur dann an der Überladungsauflö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) Weist für alle i den Wert std:: forward < Ui > ( std :: get < i > ( other ) ) an std :: get < i > ( * this ) zu.
Diese Überladung nimmt nur dann an der Überladungsauflö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) Weist für alle i den Wert std:: forward < Ui > ( std :: get < i > ( other ) ) an std :: get < i > ( * this ) zu.
Diese Überladung nimmt nur dann an der Überladungsauflö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 dann an der Überladungsauflösung teil, wenn
10) Weist p. first das erste Element und p. second das zweite Element zu.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn
11) Weist std:: forward < E1 > ( p. first ) dem ersten Element von * this und std:: forward < E2 > ( p. second ) dem zweiten Element von * this zu.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn
12) Weist std:: forward < E1 > ( p. first ) dem ersten Element und std:: forward < E2 > ( p. second ) dem zweiten Element zu.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn
13) Weist für alle i den Wert std :: get < i > ( std:: forward < UTuple > ( u ) ) an std :: get < i > ( * this ) zu.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn
14) Weist für alle i den Wert std :: get < i > ( std:: forward < UTuple > ( u ) ) an std :: get < i > ( * this ) zu.
Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn

Inhaltsverzeichnis

Parameter

other - Tupel, dessen Inhalt dieses Tupel ersetzen soll
p - Paar, dessen Inhalt dieses 2-Tupel ersetzen soll
u - tuple-like Objekt, dessen Inhalt dieses Tupel ersetzen soll

Rückgabewert

* this

Exceptions

1,2) Kann implementierungsdefinierte Ausnahmen werfen, falls die Zuweisung eines der Typen in Types eine Ausnahme wirft.
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 werfen, falls die Zuweisung eines der Typen in Types eine Ausnahme wirft.

Beispiel

#include <iostream>
#include <string>
#include <string_view>
#include <tuple>
#include <utility>
#include <vector>
// Hilfsfunktion zum Ausgeben von 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 << '}';
}
// Hilfsfunktionen zum Ausgeben eines Tupels beliebiger Größe
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 zu Tuple Beispiele //
    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);
    // Normale Kopierzuweisung
    // operator=( const tuple& other );
    t1 = t2;
    print_tuples("2) t1 = t2;\n   t1", t1, "t2", t2);
    // Normale Move-Zuweisung
    // operator=( tuple&& other );
    t1 = std::move(t2);
    print_tuples("3) t1 = std::move(t2);\n   t1", t1, "t2", t2);
    // Konvertierende Zuweisung
    // operator=( const tuple& 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);
    // Zuweisung durch Verschieben konvertieren
    // operator=( tuple&& other );
    t1 = std::move(t3);
    print_tuples("5) t1 = std::move(t3);\n   t1", t1, "t3", t3);
    // Beispiele für Pair zu Tuple //
    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);
    // Konvertierende Zuweisung von std::pair
    // operator=( const std::pair<U1, U2>& p );
    t4 = p1;
    print_tuples("7) t4 = p1;\n   t4", t4, "p1", p1);
    // Konvertierende Move-Zuweisung von 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, {}}

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 uneingeschränkt und könnte
zu unnötigem undefiniertem Verhalten führen
eingeschränkt

Siehe auch

konstruiert ein neues tuple
(öffentliche Elementfunktion)
weist die Inhalte zu
(öffentliche Elementfunktion von std::pair<T1,T2> )