68 votes

Quelles raisons légitimes existent pour surcharger l'opérateur unaire &?

D'accord, j'ai été inspiré pour faire quelques coups de tête . Cela ressemble à une surcharge operator& provoque pas une petite quantité de douleur.

Quels sont les cas légitimes pour le surcharger?

(Je ne peux pas dire que j'ai jamais fait ça ....)

52voto

Mark Ransom Points 132545

Je crois me souvenir de quelque chose comme un pointeur intelligent de la classe qui a remplacé operator& parce qu'il voulait retourner à l'adresse du pointeur plutôt que l'adresse de pointeur intelligent objet. Ne me souviens pas où je l'ai vu ou si cela semblait être une bonne idée à l'époque.

Aha, se souvient: Microsoft CComPtr.

Edit: Pour généraliser, il peut faire sens dans les conditions suivantes:

  • Vous avez un objet qui est déguisé en un autre objet.
  • Cet objet peut obtenir un pointeur vers la chose, c'est se faire passer pour l'.

De retour rien d'autre qu'un légitime pointeur violerait le principe de moindre étonnement.

10voto

Steve Jessop Points 166970

La surcharge unaire & rend votre objet se comporter comme une référence (à cet égard).

Je suis assez sûr que c'est sans issue pour tenter de proposer des alternatives aux références intégrées, en particulier depuis que les références ne sont pas des objets en C++, et ils ne disposent pas de leurs propres adresses. Les Instances de votre type défini par l'utilisateur, inévitablement, sont des objets, et de ne pas avoir les adresses, même si vous désactivez le mode normal de l'obtention de cette adresse. Donc il n'est jamais une imitation parfaite.

Mais, les gens sont très enthousiastes sur défini par l'utilisateur des solutions de rechange à des pointeurs, donc je peux voir comment quelqu'un pourrait vouloir de le tenter. Je ne suis pas sûr qu'ils vont éviter de créer un type de (sig)se comporte de manière à rendre ses utilisateurs souhaitent qu'ils n'avaient pas pris la peine.

7voto

AndyJost Points 194

Cela s’est avéré efficace dans le contexte d’un DSL générant du code LLVM. Un exemple va illustrer. Dites x et y sont des valeurs (c'est-à-dire des objets de type value ). Ensuite, l'expression x+y émet une instruction ADD dans un flux de code. De manière assez judicieuse, l'expression &x émet une instruction pour prendre l'adresse de x .

-1voto

Andrey Betenev Points 69

Une fois, j'avais l'habitude de remplacer l'opérateur & (sans modifier son comportement) en tant que paramètre privé de la classe, afin de me protéger contre la création occasionnelle de pointeur intelligent sur l'objet créé dans la pile. Toujours pas sûr que ce soit vraiment une bonne idée ...

-3voto

Thomas Eding Points 8651

Vous pouvez surcharger l'opérateur d'adresse pour le rendre privé. Cela pourrait être utile pour mettre en œuvre une sorte de système de passage de témoin, où l’adresse du témoin ne peut pas être prise. Si les constructeurs de la baguette sont masqués, la portée de la baguette peut rester étanche.

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