std::is_move_assignable, std::is_trivially_move_assignable, std::is_nothrow_move_assignable
| 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 = |
(seit C++17) | |
| template< class T > inline constexpr bool is_trivially_move_assignable_v = |
(seit C++17) | |
| template< class T > inline constexpr bool is_nothrow_move_assignable_v = |
(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
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen Zuweisungsoperator für ein bestimmtes Argument hat (Klassenvorlage) |
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen Kopierzuweisungsoperator hat (Klassenvorlage) |