C++ named requirements: CopyConstructible
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
-
Der Typ
Terfüllt die Anforderungen von MoveConstructible , und
Gegeben
-
v
, ein
Lvalue
-Ausdruck vom Typ
Toder 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
|
(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.
Code ausführen
#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 |
|---|
|
Siehe auch
|
(C++11)
(C++11)
(C++11)
|
prüft, ob ein Typ einen Kopierkonstruktor besitzt
(Klassentemplate) |
|
(C++20)
|
spezifiziert, dass ein Objekt eines Typs kopierkonstruiert und bewegungskonstruiert werden kann
(Konzept) |