C++ benannte Anforderungen: CopyConstructible
Gibt an, dass eine Instanz des Typs aus einem lvalue Ausdruck kopierkonstruiert werden kann.
Inhalt |
[bearbeiten] Anforderungen
Der Typ T erfüllt CopyConstructible, wenn
- Der Typ
TMoveConstructible ist, und
Gegeben
- v, ein lvalue Ausdruck vom Typ
Toder 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 |
(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. Führen Sie diesen Code aus #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 |
|---|
|
[bearbeiten] Siehe auch
| (C++11)(C++11)(C++11) |
prüft, ob ein Typ einen Kopierkonstruktor hat (Klassenvorlage) |
| (C++20) |
gibt an, dass ein Objekt eines Typs kopierkonstruiert und per Move konstruiert werden kann (Konzept) |