Namensräume
Varianten
Aktionen

std::is_assignable, std::is_trivially_assignable, std::is_nothrow_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
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, class U >
struct is_assignable;
(1) (seit C++11)
template< class T, class U >
struct is_trivially_assignable;
(2) (seit C++11)
template< class T, class U >
struct is_nothrow_assignable;
(3) (seit C++11)
1) Wenn der Ausdruck std::declval<T>() = std::declval<U>() in einem unevaluierten Kontext wohldefiniert ist, enthält er das Elementkonstante value gleich true. Andernfalls ist value false. Zugriffsprüfungen werden durchgeführt, als kämen sie aus einem Kontext, der von keinem der beiden Typen unabhängig ist.
2) Wie in (1), aber die Auswertung des Zuweisungsausdrucks ruft keine Operation auf, die nicht trivial ist. Für die Zwecke dieser Prüfung gilt ein Aufruf von std::declval als trivial und wird nicht als ODR-Verwendung von std::declval betrachtet.
3) Wie in (1), aber die Auswertung des Zuweisungsausdrucks ruft keine Operation auf, die nicht noexcept ist.

Wenn T oder U kein vollständiger Typ ist, (möglicherweise cv-qualifiziert) void oder ein Array unbekannter Bindung, 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, class U >
constexpr bool is_assignable_v = is_assignable<T, U>::value;
(seit C++17)
template< class T, class U >
constexpr bool is_trivially_assignable_v = is_trivially_assignable<T, U>::value;
(seit C++17)
template< class T, class U >
constexpr bool is_nothrow_assignable_v = is_nothrow_assignable<T, U>::value;
(seit C++17)

Abgeleitet von std::integral_constant

Member-Konstanten

value
[static]
true, wenn T von U 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] Anmerkungen

Diese Trait prüft nichts außerhalb des unmittelbaren Kontexts des Zuweisungsausdrucks: Wenn die Verwendung von T oder U Vorlagen-Spezialisierungen, die Generierung implizit definierter spezieller Memberfunktionen usw. auslösen würde und diese Fehler enthalten, wird die eigentliche Zuweisung möglicherweise nicht kompiliert, auch wenn std::is_assignable<T,U>::value kompiliert und zu true ausgewertet wird.

[bearbeiten] Beispiel

#include <iostream>
#include <string>
#include <type_traits>
 
struct Ex1 { int n; };
 
int main()
{
    std::cout << std::boolalpha
              << "int is assignable from int? "
              << std::is_assignable<int, int>::value << '\n' // 1 = 1; wouldn't compile
              << "int& is assignable from int? "
              << std::is_assignable<int&, int>::value << '\n' // int a; a = 1; works
              << "int is assignable from double? "
              << std::is_assignable<int, double>::value << '\n'
              << "int& is nothrow assignable from double? "
              << std::is_nothrow_assignable<int&, double>::value << '\n'
              << "string is assignable from double? "
              << std::is_assignable<std::string, double>::value << '\n'
              << "Ex1& is trivially assignable from const Ex1&? "
              << std::is_trivially_assignable<Ex1&, const Ex1&>::value << '\n';
}

Ausgabe

int is assignable from int? false
int& is assignable from int? true
int is assignable from double? false
int& is nothrow assignable from double? true
string is assignable from double? true
Ex1& is trivially assignable from const Ex1&? true

[bearbeiten] Siehe auch

prüft, ob ein Typ einen Kopierzuweisungsoperator hat
(Klassenvorlage) [bearbeiten]
prüft, ob ein Typ einen Verschiebezuweisungsoperator hat
(Klassenvorlage) [bearbeiten]
gibt an, dass ein Typ von einem anderen Typ zuweisbar ist
(Konzept) [bearbeiten]