std:: assignable_from
|
Défini dans l'en-tête
<concepts>
|
||
|
template
<
class
LHS,
class
RHS
>
concept assignable_from
=
|
(depuis C++20) | |
Le concept
assignable_from<LHS, RHS>
spécifie qu'une expression du type et de la catégorie de valeur spécifiés par
RHS
peut être assignée à une expression lvalue dont le type est spécifié par
LHS
.
Table des matières |
Exigences sémantiques
Étant donné
-
lhs, une lvalue qui fait référence à un objetlcopytel que decltype ( ( lhs ) ) estLHS, -
rhs, une expression telle que decltype ( ( rhs ) ) estRHS, -
rcopy, un objet distinct qui est égal àrhs,
assignable_from<LHS, RHS>
est modélisé seulement si
- std:: addressof ( lhs = rhs ) == std:: addressof ( lcopy ) (c'est-à-dire que l'expression d'assignation produit une lvalue se référant à l'opérande gauche) ;
-
Après l'évaluation de
lhs
=
rhs
:
-
lhsest égal àrcopy, sauf sirhsest une xvalue non constante qui se réfère àlcopy(c'est-à-dire que l'assignation est une auto-affectation par déplacement) ; -
si
rhsest une glvalue :- Si c'est une xvalue non constante, l'objet auquel elle se réfère est dans un état valide mais non spécifié ;
- Sinon, l'objet auquel elle se réfère n'est pas modifié ;
-
Préservation de l'égalité
Les expressions déclarées dans les requires expressions des concepts de la bibliothèque standard doivent être equality-preserving (sauf indication contraire).
Notes
L'assignation n'a pas besoin d'être une fonction totale. En particulier, si l'assignation à un objet
x
peut entraîner la modification d'un autre objet
y
, alors
x
=
y
n'appartient probablement pas au domaine de
=
. Cela se produit typiquement lorsque l'opérande droit est possédé directement ou indirectement par l'opérande gauche (par exemple, avec des pointeurs intelligents vers des nœuds dans une structure de données à base de nœuds, ou avec quelque chose comme
std::
vector
<
std::
any
>
).
Exemple
#include <atomic> #include <concepts> #include <string> int main() { // Utilisation basique normale, vérifie l'assignation par référence lvalue static_assert(std::is_assignable_v<int&, int>); static_assert(std::assignable_from<int&, int>); static_assert(std::is_assignable_v<std::string&, std::string>); static_assert(std::assignable_from<std::string&, std::string>); // Les types fondamentaux ne supportent pas l'assignation à une rvalue static_assert(!std::is_assignable_v<int, int>); static_assert(!std::assignable_from<int, int>); // std::assignable_from n'accepte pas toutes les expressions d'assignation valides : // assignation par référence rvalue static_assert(std::is_assignable_v<std::string&&, std::string>); static_assert(!std::assignable_from<std::string&&, std::string>); // assignation rvalue static_assert(std::is_assignable_v<std::string, std::string>); static_assert(!std::assignable_from<std::string, std::string>); // std::atomic::operator= retourne par valeur static_assert(std::is_assignable_v<std::atomic<int>&, int>); static_assert(!std::assignable_from<std::atomic<int>&, int>); }
Références
- Norme C++23 (ISO/CEI 14882:2024) :
-
-
18.4.8 Concept
assignable_from[concept.assignable]
-
18.4.8 Concept
- Norme C++20 (ISO/CEI 14882:2020) :
-
-
18.4.8 Concept
assignable_from[concept.assignable]
-
18.4.8 Concept
Voir aussi
|
(C++11)
(C++11)
(C++11)
|
vérifie si un type possède un opérateur d'affectation pour un argument spécifique
(modèle de classe) |