Namespaces
Variants

C++ named requirements: CopyConstructible

From cppreference.net
C++ named requirements

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

Inhaltsverzeichnis

Anforderungen

Der Typ T erfüllt die Anforderungen von CopyConstructible wenn

Gegeben

  • v , ein Lvalue -Ausdruck vom Typ T oder const T oder ein Rvalue -Ausdruck vom Typ const T ,
  • u , eine beliebige Bezeichnung.

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

Ausdruck Nachbedingungen
T u = v ; Der Wert von u entspricht dem Wert von v .

Der Wert von v bleibt unverändert.

T ( v ) Der Wert von T ( v ) entspricht dem Wert von v .

Der Wert von v bleibt unverändert.

Der Ausdruck v.~T ( ) muss ebenfalls gültig sein, und für Lvalue v muss der Ausdruck & v den Typ T* oder const T * haben und muss zur Adresse von v ausgewertet werden.

(bis C++11)

Hinweise

Bis C++11 waren Klassen, die operator & überladen haben, nicht CopyConstructible und konnten daher nicht in den Standardbibliothek-Containern verwendet werden. Dies war eine Designentscheidung in C++98 (anstelle eines Defekts, siehe LWG Issue 390 ).

Seit C++11 verwendet die Standardbibliothek std::addressof immer dann, wenn die Adresse eines Objekts benötigt wird.

Erweiterter Inhalt

Eine CopyConstructible -Klasse impliziert std::is_copy_constructible , aber nicht umgekehrt, da std::is_copy_constructible nur die Fähigkeit prüft, den Konstruktor mit den korrekten Argumenten aufzurufen, und z.B. nicht die 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
}

Referenzen

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

Siehe auch

prüft, ob ein Typ einen Kopierkonstruktor besitzt
(Klassentemplate)
spezifiziert, dass ein Objekt eines Typs kopierkonstruiert und bewegungskonstruiert werden kann
(Konzept)