48 votes

Qu'est-ce que signifie un esperluette après cet opérateur d'assignation?

J'étais en train de lire cette belle réponse concernant le "Rule-of-five" et j'ai remarqué quelque chose que je ne me rappelle pas avoir vu auparavant :

class C {
  ...
  C& operator=(const C&) & = default;
  C& operator=(C&&) & = default;
  ...
};

Quel est le but du caractère & placé devant = default pour l'opérateur d'affectation par copie et pour l'opérateur d'affectation par déplacement ? Est-ce que quelqu'un a une référence pour cela ?

37voto

Nicol Bolas Points 133791

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;

13voto

Cela signifie que cette fonction n'est appelable que sur des lvalues. Donc, cela échouera car la fonction de l'opérateur d'assignation est appelée sur une expression d'objet rvalue :

C() = x;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X