C++ named requirements: CopyConstructible
Spécifie qu'une instance du type peut être construite par copie à partir d'une expression lvalue .
Table des matières |
Exigences
Le type
T
satisfait
CopyConstructible
si
-
Le type
Tsatisfait MoveConstructible , et
Étant donné
-
v
, une expression
lvalue
de type
Tou const T , ou une expression rvalue de type const T , - u , un identifiant arbitraire.
Les expressions suivantes doivent être valides et avoir leurs effets spécifiés :
| Expression | Post-conditions |
|---|---|
| T u = v ; |
La valeur de
u
est équivalente à la valeur de
v
.
La valeur de v reste inchangée. |
| T ( v ) |
La valeur de
T
(
v
)
est équivalente à la valeur de
v
.
La valeur de v reste inchangée. |
|
L'expression
v.~T
(
)
doit également être valide, et, pour une lvalue
v
, l'expression
&
v
doit avoir le type
|
(jusqu'à C++11) |
Notes
Jusqu'à C++11, les classes qui surchargeaient operator & n'étaient pas CopyConstructible et n'étaient donc pas utilisables dans les conteneurs standards . Il s'agit d'une décision de conception en C++98 (plutôt qu'un défaut, voir LWG issue 390 ).
Depuis C++11, la bibliothèque standard utilise std::addressof chaque fois que l'adresse d'un objet est nécessaire.
| Contenu étendu |
|---|
|
Le fait d'être une classe CopyConstructible implique std::is_copy_constructible mais pas l'inverse, car std::is_copy_constructible ne vérifie que la capacité d'appeler le constructeur avec les arguments corrects, et non, par exemple, une exigence MoveConstructible .
Exécuter ce code
#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 } |
Références
| Contenu étendu |
|---|
|
Voir aussi
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un constructeur de copie
(modèle de classe) |
|
(C++20)
|
spécifie qu'un objet d'un type peut être copié et déplacé par construction
(concept) |