Il fait partie d'une fonction permettant aux fonctions membres non statiques de C++11 de différencier s'ils sont appelés sur des lvalues ou rvalues.
Dans le cas ci-dessus, l'opérateur d'affectation par copie étant mis par défaut ici ne peut être appelé que sur des lvalues. Cela utilise les règles de liaison des références lvalues et rvalues qui sont bien établies; cela les établit simplement pour this
.
Dans le cas ci-dessus, l'opérateur d'affectation par copie est mis par défaut uniquement si l'objet copié peut se lier à une référence lvalue non constante. Donc ceci est correct:
C c{};
c = C{};
Ceci ne l'est pas:
C{} = c;
Le temporaire ici ne peut pas se lier à une référence lvalue, et donc l'opérateur d'affectation par copie ne peut pas être appelé. Et comme cette déclaration empêchera la création de l'opérateur d'affectation par copie habituel, cette syntaxe empêche effectivement l'affectation par copie (ou affectation par déplacement) à des temporaires. Pour restaurer cela, vous devriez ajouter une version &&
:
C& operator=(const C&) && = default;
C& operator=(C&&) && = default;