Namensräume
Varianten
Aktionen

std::is_copy_constructible, std::is_trivially_copy_constructible, std::is_nothrow_copy_constructible

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 >
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 =

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

inline constexpr bool is_trivially_copy_constructible_v =

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

inline constexpr bool is_nothrow_copy_constructible_v =

    is_nothrow_copy_constructible<T>::value;
(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

prüft, ob ein Typ einen Konstruktor für spezifische Argumente hat
(Klassenvorlage) [bearbeiten]
prüft, ob ein Typ einen Standardkonstruktor hat
(Klassenvorlage) [bearbeiten]
prüft, ob ein Typ aus einer rvalue-Referenz konstruiert werden kann
(Klassenvorlage) [bearbeiten]
gibt an, dass ein Objekt eines Typs kopierkonstruiert und per Move konstruiert werden kann
(Konzept) [bearbeiten]