Lorsque vous =delete
d'une fonction, vous êtes effectivement la suppression de sa définition.
8.4.3 Supprimé définitions [dcl.fct.def.supprimer]
1 la définition d'Une fonction de la forme:
attribut spécificateur-seqopt decl-spécificateur-seqopt de demande de déclaration = delete ;
est appelé supprimé définition. Une fonction avec un supprimée définition est appelé aussi supprimé la fonction.
Mais en procédant ainsi, vous êtes également déclarer cette fonction. Citant le standard [1]:
4 A supprimé la fonction est implicitement en ligne. [ Note: La définition de la règle (3.2) s'applique à supprimé de définitions.
-la note de fin de ] A supprimé la définition d'une fonction est la première déclaration de la fonction [...]
Et donc, en faisant a = A()
, le compilateur fait résout A::operator=(A&&)
parce qu'il a été déclaré (pas A::operator(const A&)
car A&&
"plus contraignantes" pour les valeurs r). Cependant, avec sa définition étant supprimé, la ligne est mal formé.
2 Un programme qui fait référence à une suppression de la fonction implicitement ou explicitement, d'autres que de déclarer qu'il est mal formé.
[1] Le ton de l'a souligné la phrase ici est en fait un impératif. La norme stipule que la déclaration d'une fonction =delete
d doit d'abord apparaître avant les autres déclarations d'elle. Mais encore, il soutient le fait que la suppression d'une fonction, il déclare la fonction.