Namensräume
Varianten
Aktionen

C++ benannte Anforderungen: CopyConstructible

Von cppreference.com
 
 
C++ benannte Anforderungen
 

Gibt an, dass eine Instanz des Typs aus einem lvalue Ausdruck kopierkonstruiert werden kann.

Inhalt

[bearbeiten] Anforderungen

Der Typ T erfüllt CopyConstructible, wenn

Gegeben

  • v, ein lvalue Ausdruck vom Typ T oder const T oder ein rvalue Ausdruck vom Typ const T,
  • u, eine beliebige Kennung.

Die folgenden Ausdrücke müssen gültig sein und ihre angegebenen Effekte haben

Ausdruck Nachbedingungen
T u = v; Der Wert von u ist äquivalent zum Wert von v.

Der Wert von v bleibt unverändert.

T(v) Der Wert von T(v) ist äquivalent zum Wert von v.

Der Wert von v bleibt unverändert.

Der Ausdruck v.~T() muss ebenfalls gültig sein, und für ein lvalue v muss der Ausdruck &v den Typ T* oder const T* haben und zum Adresswert von v auswerten.

(bis C++11)

[bearbeiten] Hinweise

Bis C++11 waren Klassen, die operator& überladen hatten, nicht CopyConstructible und somit nicht in den Standardbibliothekscontainern verwendbar. Dies ist eine Designentscheidung in C++98 (statt eines Fehlers, siehe LWG-Problem 390).

Seit C++11 verwendet die Standardbibliothek std::addressof, wann immer der Adresswert eines Objekts benötigt wird.

Erweiterter Inhalt

Eine CopyConstructible Klasse impliziert std::is_copy_constructible, aber nicht umgekehrt, da std::is_copy_constructible nur prüft, ob der Konstruktor mit den korrekten Argumenten aufgerufen werden kann, und z.B. keine MoveConstructible Anforderung.

#include <type_traits>
#include <utility>
 
struct S
{
    S() = default;
    S(S&&) = delete;
    S(const S&) = default;
};
static_assert(std::is_copy_constructible_v<S>);
 
int main()
{
    S s1;
 
    // Class `S` doesn't satisfy MoveConstructible requirement,
    // hence doesn't satisfy CopyConstructible requirement
    [[maybe_unused]] S s2{std::move(s1)}; // ill-formed, use of deleted function
}

[bearbeiten] Referenzen

Erweiterter Inhalt
  • C++23 Standard (ISO/IEC 14882:2024)
  • 16.4.4.2 Template-Argument-Anforderungen [utility.arg.requirements]

[bearbeiten] Siehe auch

prüft, ob ein Typ einen Kopierkonstruktor hat
(Klassenvorlage) [bearbeiten]
gibt an, dass ein Objekt eines Typs kopierkonstruiert und per Move konstruiert werden kann
(Konzept) [bearbeiten]