Namespaces
Variants

C++ named requirements: CopyConstructible

From cppreference.net
C++ named requirements

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

Étant donné

  • v , une expression lvalue de type T ou 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 T* ou const T * et doit s'évaluer à l'adresse de v .

(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 .

#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
  • Norme C++23 (ISO/CEI 14882:2024) :
  • 16.4.4.2 Exigences des arguments de template [utility.arg.requirements]

Voir aussi

vérifie si un type possède un constructeur de copie
(modèle de classe)
spécifie qu'un objet d'un type peut être copié et déplacé par construction
(concept)