Namensräume
Varianten
Aktionen

std::is_move_assignable, std::is_trivially_move_assignable, std::is_nothrow_move_assignable

Von cppreference.com
< cpp‎ | types
 
 
Metaprogrammierungsbibliothek
Typmerkmale
Typkategorien
(C++11)
(C++11)(DR*)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11) 
(C++11)
(C++11)
Typeneigenschaften
(C++11)
(C++11)
(C++14)
(C++11)(deprecated in C++26)
(C++11)(bis C++20*)
(C++11)(veraltet in C++20)
(C++11)
Typmerkmalskonstanten
Metafunktionen
(C++17)
Unterstützte Operationen
is_move_assignableis_trivially_move_assignableis_nothrow_move_assignable
(C++11)(C++11)(C++11)

Beziehungen und Eigenschaftsabfragen
Typmodifikationen
(C++11)(C++11)(C++11)
Typentransformationen
(C++11)(veraltet in C++23)
(C++11)(veraltet in C++23)
(C++11)
(C++11)(bis C++20*)(C++17)

(C++11)
(C++11)
(C++17)
Rationale Arithmetik zur Compilezeit
Ganzzahlsequenzen zur Compilezeit
 
Definiert in der Kopfdatei <type_traits>
template< class T >
struct is_move_assignable;
(1) (seit C++11)
template< class T >
struct is_trivially_move_assignable;
(2) (seit C++11)
template< class T >
struct is_nothrow_move_assignable;
(3) (seit C++11)
 Typ-Trait  Der Wert der Member-Konstante value
T ist ein referenzierbarer Typ  T ist kein referenzierbarer Typ 
(1) std::is_assignable<T&, T&&>::value false
(2) std::is_trivially_assignable<T&, T&&>::value
(3) std::is_nothrow_assignable<T&, T&&>::value

Wenn T kein vollständiger Typ ist, (möglicherweise cv-qualifiziert) void oder ein Array unbekannter Größe, ist das Verhalten undefiniert.

Wenn eine Instanziierung einer Vorlage davon direkt oder indirekt von einem unvollständigen Typ abhängt und diese Instanziierung ein anderes Ergebnis liefern könnte, wenn dieser Typ hypothetisch vervollständigt würde, ist das Verhalten undefiniert.

Wenn das Programm Spezialisierungen für eine der auf dieser Seite beschriebenen Vorlagen hinzufügt, ist das Verhalten undefiniert.

Inhalt

[bearbeiten] Hilfsvariablen-Templates

template< class T >

inline constexpr bool is_move_assignable_v =

    is_move_assignable<T>::value;
(seit C++17)
template< class T >

inline constexpr bool is_trivially_move_assignable_v =

    is_trivially_move_assignable<T>::value;
(seit C++17)
template< class T >

inline constexpr bool is_nothrow_move_assignable_v =

    is_nothrow_move_assignable<T>::value;
(seit C++17)

Abgeleitet von std::integral_constant

Member-Konstanten

value
[static]
true, wenn T verschiebbar-zuweisbar ist, andernfalls false
(öffentliche statische Member-Konstante)

Memberfunktionen

operator bool
konvertiert das Objekt zu bool, gibt value zurück
(öffentliche Memberfunktion)
operator()
(C++14)
gibt value zurück
(öffentliche Memberfunktion)

Membertypen

Typ Definition
value_type bool
type std::integral_constant<bool, value>

[bearbeiten] Mögliche Implementierung

template<class T>
struct is_move_assignable
    : std::is_assignable<typename std::add_lvalue_reference<T>::type,
                         typename std::add_rvalue_reference<T>::type> {};
 
template<class T>
struct is_trivially_move_assignable
    : std::is_trivially_assignable<typename std::add_lvalue_reference<T>::type,
                                   typename std::add_rvalue_reference<T>::type> {};
 
template<class T>
struct is_nothrow_move_assignable
    : std::is_nothrow_assignable<typename std::add_lvalue_reference<T>::type,
                                 typename std::add_rvalue_reference<T>::type> {};

[bearbeiten] Hinweise

Die Auswertung std::is_move_assignable ist weniger streng als MoveAssignable, da sie nicht den Typ des Ergebnisses der Zuweisung überprüft (der für einen MoveAssignable-Typ T& sein muss) und auch nicht die semantische Anforderung, dass der Wert des Ziels nach der Zuweisung äquivalent zum Wert der Quelle vor der Zuweisung ist.

Der Typ muss keinen Verschiebezuweisungsoperator implementieren, um dieses Merkmal zu erfüllen; siehe MoveAssignable für Details.

[bearbeiten] Beispiel

#include <iostream>
#include <string>
#include <type_traits>
 
struct Foo { int n; };
 
struct NoMove
{
    // prevents implicit declaration of default move assignment operator
    // however, the class is still move-assignable because its
    // copy assignment operator can bind to an rvalue argument
    NoMove& operator=(const NoMove&) { return *this; }
};
 
int main()
{
    std::cout << std::boolalpha
              << "std::string is nothrow move-assignable? "
              << std::is_nothrow_move_assignable<std::string>::value << '\n'
              << "int[2] is move-assignable? "
              << std::is_move_assignable<int[2]>::value << '\n'
              << "Foo is trivially move-assignable? "
              << std::is_trivially_move_assignable<Foo>::value << '\n'
              << "NoMove is move-assignable? "
              << std::is_move_assignable<NoMove>::value << '\n'
              << "NoMove is nothrow move-assignable? "
              << std::is_nothrow_move_assignable<NoMove>::value << '\n';
}

Ausgabe

std::string is nothrow move-assignable? true
int[2] is move-assignable? false
Foo is trivially move-assignable? true
NoMove is move-assignable? true
NoMove is nothrow move-assignable? false

[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 2196 C++11 Das Verhalten war unklar, wenn T&& nicht gebildet werden konnte der erzeugte Wert ist in diesem Fall false

[bearbeiten] Siehe auch

prüft, ob ein Typ einen Zuweisungsoperator für ein bestimmtes Argument hat
(Klassenvorlage) [bearbeiten]
prüft, ob ein Typ einen Kopierzuweisungsoperator hat
(Klassenvorlage) [bearbeiten]