std::is_copy_constructible, std::is_trivially_copy_constructible, std::is_nothrow_copy_constructible
| Definiert in der Kopfdatei <type_traits> |
||
| template< class T > struct is_copy_constructible; |
(1) | (seit C++11) |
| template< class T > struct is_trivially_copy_constructible; |
(2) | (seit C++11) |
| template< class T > struct is_nothrow_copy_constructible; |
(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_constructible<T, const T&>::value | false |
| (2) | std::is_trivially_constructible<T, const T&>::value | |
| (3) | std::is_nothrow_constructible<T, const 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_copy_constructible_v = |
(seit C++17) | |
| template< class T > inline constexpr bool is_trivially_copy_constructible_v = |
(seit C++17) | |
| template< class T > inline constexpr bool is_nothrow_copy_constructible_v = |
(seit C++17) | |
Abgeleitet von std::integral_constant
Member-Konstanten
| value [static] |
true, falls T kopierkonstruierbar ist, false andernfalls(ö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_copy_constructible : std::is_constructible<T, typename std::add_lvalue_reference< typename std::add_const<T>::type>::type> {}; template<class T> struct is_trivially_copy_constructible : std::is_trivially_constructible<T, typename std::add_lvalue_reference< typename std::add_const<T>::type>::type> {}; template<class T> struct is_nothrow_copy_constructible : std::is_nothrow_constructible<T, typename std::add_lvalue_reference< typename std::add_const<T>::type>::type> {}; |
[bearbeiten] Anmerkungen
In vielen Implementierungen prüft is_nothrow_copy_constructible auch, ob der Destruktor wirft, da er effektiv noexcept(T(arg)) ist. Das Gleiche gilt für is_trivially_copy_constructible, was in diesen Implementierungen auch einen trivialen Destruktor erfordert: GCC Bug 51452, LWG Issue 2116.
[bearbeiten] Beispiel
#include <string> #include <type_traits> struct S1 { std::string str; // member has a non-trivial copy constructor }; static_assert(std::is_copy_constructible_v<S1>); static_assert(!std::is_trivially_copy_constructible_v<S1>); struct S2 { int n; S2(const S2&) = default; // trivial and non-throwing }; static_assert(std::is_trivially_copy_constructible_v<S2>); static_assert(std::is_nothrow_copy_constructible_v<S2>); struct S3 { S3(const S3&) = delete; // explicitly deleted }; static_assert(!std::is_copy_constructible_v<S3>); struct S4 { S4(S4&) {}; // cannot bind const, hence not a copy-constructible }; static_assert(!std::is_copy_constructible_v<S4>); int main() {}
[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 const 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 Konstruktor für spezifische Argumente hat (Klassenvorlage) |
| prüft, ob ein Typ einen Standardkonstruktor hat (Klassenvorlage) | |
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ aus einer rvalue-Referenz konstruiert werden kann (Klassenvorlage) |
| (C++20) |
gibt an, dass ein Objekt eines Typs kopierkonstruiert und per Move konstruiert werden kann (Konzept) |