[C++] prototype de operator+

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, et merci d’avance si vous pouvez "éclaircir ma lanterne".

Je reprends ici un sujet que j’ai ouvert dans la discussion sur la beta du tuto sur le "C++ moderne" (et oui, pôve débutant et pôve naïf, je pensais être utile !). J’étais persuadé que le prototype de operator+ était:

truc operator+(truc const & a, truc const & b)

Romantik m’a répondu (merci de l’avoir fait) et expliqué les avantages d’utiliser le prototype suivant (une référence de moins dans la pile):

truc operator+(truc a, truc const & b)

Merci aussi, à Gbdiver, de me donnée la référence dans cppreference.com. Alors je creuse (Faut dire que cppreference.com, c’est pas le plus cool à lire). Et je tombe sur la page suivante, où il est proposé comme prototype:

T operator+(const T & a, const T2 & b);

Alors, là, je comprends plus: La fonction tel que le prototype justifié par Romantik compile et fonctionne. Mais si j’ai bien compris, cppreference.com, elle n’a pas le bon prototype.

Oups! help !

+0 -0
Auteur du sujet

Ca c’est de la réponse rapide!

Merci Ksass`Peuk.

J’en déduis:

  • Il n’y a pas de règle pour le prototype de operator+
  • La forme proposée par le cours "C++ moderne" est meilleure

Bon OK sur ce point! Mais pour les autres operators/algo courants, y a t’il aussi des version dit "Idiomatique" ? C’est définit où ? Par qui ?

Bien cordialement.

+0 -0

Cette réponse a aidé l’auteur du sujet

  • Il n’y a pas de règle pour le prototype de operator+
Dedeun

Oh ben si quand même : il doit y avoir deux paramètres :P

  • La forme proposée par le cours "C++ moderne" est meilleure

Bon OK sur ce point! Mais pour les autres operators/algo courants, y a t’il aussi des version dit "Idiomatique" ? C’est définit où ? Par qui ?

Dedeun

Ici : https://en.cppreference.com/w/cpp/language/operators

Et il doit y avoir probablement des choses dans le C++ Core Guidelines.

First : Always RTFM - "Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein [Tutoriel Frama-C WP]

+0 -0

Cette réponse a aidé l’auteur du sujet

Les C++ Core Guideline oublient de dire qu’ami, ce serait mieux. Il y a eu une conf de Jossutis dans les cppcon 19 (When C++ Style guides Contradict) qui en parlait il y a peu. J’ai oublié le terme qui avait été utilisé. Trouvé. Hidden friends

Sinon, la 1ere et la 3e écriture sont la même. Ce qui change c’est east-const VS west-const.

La 2e est une optimisation, que j’ai bien envie de décrire comme partielle. Si l’objet est vraiment gros, il faut viser 4 signatures qui alternent rvalue-ref et const-ref. Et encore, l’introduction de références peut avoir un coût qu’il faudrait exactement benchmarker. Et dans tous les cas, s’il y a vraiment des gros soucis de perfs à introduire des temporaires à tout bout de champ, il faut viser d’autres séries d’optimisations que les bibliothèques matricielles du C++ emploient toutes aujourd’hui.

+0 -0
Auteur du sujet
  • Il n’y a pas de règle pour le prototype de operator+
Dedeun

Oh ben si quand même : il doit y avoir deux paramètres :P

Ksass`Peuk

Et Oui! C’est le minimum! OK!

  • La forme proposée par le cours "C++ moderne" est meilleure

Bon OK sur ce point! Mais pour les autres operators/algo courants, y a t’il aussi des version dit "Idiomatique" ? C’est définit où ? Par qui ?

Dedeun

Ici : https://en.cppreference.com/w/cpp/language/operators

Ksass`Peuk>

Ok, je viens de parcourir, et chercher … (toujours pas cool!), et si j’ai bien compris, tu voulais me faire voir le texte: ("canonical" et "idiomatique", c’est la même chose ?)

Commonly overloaded operators have the following typical, canonical forms:[1]

Donc le renvois, tout en bas de la page, c’est à dire, ici

Et il doit y avoir probablement des choses dans le C++ Core Guidelines.

Ksass`Peuk

Pas trouvé ! c’est de ça que tu parles ?

Luc, Je ne comprends pas ta première remarque: quel est le lien avec "friend" ?

Bien sur qu’il doit y a voir d’autre optimisation possible, si réellement il y un pb de perfo. J’y réfléchirai, et reviendrai vers vous si besoin.

Bien cordialement.

+0 -0

Cette réponse a aidé l’auteur du sujet

Luc, Je ne comprends pas ta première remarque: quel est le lien avec "friend" ?

Dedeun

Cf cppreference, la forme idiomatique, c’est avec 2 parametres (donc normalement en fonction libre), mais en fonction membre + ajout de friend.

Les C++ Core Guideline oublient de dire qu’ami, ce serait mieux.

lmghs

Dans C.160, la forme proposée est la même, avec friend.

Mais si j’ai bien compris, cppreference.com, elle n’a pas le bon prototype.

Dedeun

En fait, tu prends le probleme a l’envers. Le compilateur ne demande pas un prototype en particulier. Quand il tombe sur un code qui utilise + (dans cet exemple), il suit des règles un peu complexes et chia…, fais la liste des fonctions qui peuvent correspondre et décide, selon des règles de priorités tout aussi complexes et chian… laquelle appeler.

Cf https://en.cppreference.com/w/cpp/language/lookup et tous les dérivés, en fonction de la portée, des arguments, des templates, des surcharges, etc.

Oh ben si quand même : il doit y avoir deux paramètres :P

Ksass`Peuk

Même pas, puisqu’il y peut y avoir la version en fonction membre, avec 1 paramètre.

J’y réfléchirai, et reviendrai vers vous si besoin.

Dedeun

Ne passe pas trop de temps la dessus. Honnêtement, la plupart des personnes (même moi) serions incapables de donner de tète tous les code d’exemple qui justifient ces écritures. C’est le genre de choses que les experts discutent pendant des années avant de trouver les justifications et c’est souvent des cas très rares. C’est pour ça qu’on a utilise (et continue d’utiliser, cf par exemple https://doc.qt.io/qt-5/qpoint.html) la version avec const ref.

Pour poser des questions ou simplement discuter informatique, vous pouvez rejoindre le discord NaN.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte