Et encore, operator[] et operator=, c'est très fréquent de les surcharger, j'ai croisé une surcharge de operator(), tout ça pour économiser un getter... L'appel ressemble à un constructeur, c'est assez troublant, mais même ça au final, est-ce que ça mérite un warning?
http://coliru.stacked-crooked.com/a/72122c6988e6e209
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 #include <iostream> #include <string> #include <vector> class Foo { public: Foo(int val){_val=val;} int operator()(){return _val;} private: int _val; }; int main() { std::vector<std::string> vec = { "Hello", "from", "GCC", __VERSION__, "!" }; Foo foo = Foo(42); std::cout << foo() << std::endl; // Affiche "42" return 0; }
Quand une classe n'a qu'une seule opération importante, c'est normal de surcharger operator(). Il faut cependant veiller à ce que le nom de la classe soit suffisamment clair pour que l'on sache ce que fera operator().
Quand on utilise <algorithm> de la bibliothèque standard, quand on veut personnaliser un prédicat ou un critère de comparaison, on passe souvent par une classe qui surcharge operator().
Quand on veut mettre un objet dans un std::function, il faut que l'objet appartienne à une classe qui surcharge operator().
il faudrait mettre un warning aussi sur les horreurs du genre
( avec i et j des entier).
Code : Sélectionner tout - Visualiser dans une fenêtre à part j=i++*i++ ;
le comporte en C/ C++ ( pour i=10 on trouve j=100) est différent de Java/C#/Javascript/PHP ( pour i=10 on trouve j=110).
J'aimerai bien savoir comment, ce n'est pas en respect du standard.
Quel compilateur sort cet immondice en C/C++ ?
Avec gcc 5.4.1 :
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int main() { int j, i; i = 10; j = i++*i++; printf("%d",j); return 0; }110
par ex :
https://gynvael.coldwind.pl/?id=372
https://stackoverflow.com/questions/...rement-concept
https://www.sanfoundry.com/c-plus-pl...ent-decrement/ ( question 7).
https://stackoverflow.com/questions/...c-java-c-sharp
For C, see N1256 (PDF), sect 6.5, para 2; sect 6.5.2.4, para 2. I can't get to the C++ standard currently, but the language is largely the same. – John Bode Jun 23 '11 at 17:29
on l'avez vu dans la spec de C ou C++ (il y a longtemps ) quand on avais constaté le comportement ( c'est il y a longtemps).
j'ai même lu quelque part que les createur de C# ne voulaient pas du comportent de C/C++ pour ++/--.
Pour Java et C# , la post/pre ++/-- est atomique à l’opération de lecture.
alors quand C/C++ , il peut faire les pre(de)incrementation ,avant la lecture des operantes de l'operateur binaire puis ensuites les post(de)incrementation. il ont pu corrigé
Bonjour
Absolument pas. Le C a été conçu dans la philosophie "le programmeur sait ce qu'il fait" et donc j'attends de gcc qu'il respecte cette idéologie. Et si je veux écrire 2 xor 16 j'apprécierai mal qu'il vienne se mêler de mes affaires avec des remarques du style "je pense que tu es en train de te planter" parce que 99 fois sur 100 celui qui écrit ça n'est pas en train de se planter et pour la centième fois, il compile, teste, voit que le résultat n'est pas bon, rajoute un printf() et trouve l'erreur.Êtes-vous en accord avec la nécessité que GCC génère ce warning ?
Ou alors je serai d'accord s'il met alors un warning pour toutes les opérations dont le résultat est calculable à l'écriture. Par exemple int a=3+4 => warning int a=7. Dans ce cas et ce cas seulement, un warning sur 2^16 peut éventuellement se justifier.
@AoCannaille: si tu veux des erreurs, tu peux toujours utiliser -Werror ou plus spécifiquement -Werror=return-type.
Pas nécessairement, cela engendre des comportements indéfinis souvent assez grave. Quel intérêt de ne rien retourner si la fonction dit retourner une valeur ? C'est le bon moyen d'avoir des valeurs totalement random ou de faire planter le programme (comme ça peut être le cas avec clang).
De plus, les compilateurs ne respectent pas toujours parfaitement la norme. Par exemple, gcc émet un avertissement -Wnarrowing pour char x{y}; avec y de type int, alors que c'est une erreur d'après le standard. Cela ne compile d'ailleurs pas avec clang et msvc.
Tu veux dire quelque chose comme ceciil faudrait mettre un warning aussi sur les horreurs du genre j=i++*i++
(gcc)warning: operation on ‘i’ may be undefined [-Wsequence-point]
(clang)warning: multiple unsequenced modifications to 'i' [-Wunsequenced]
Ou parce qu'on a pas l'habitude des opérateurs bit à bit. Ou qu'on utilise des langages qui se servent de cet opérateur comme puissance. Ou parce qu'on écrit généralement la puissance avec ^. Il y a plein de raison pour tomber dans le piège. Ce qui n'est pas le cas de xor qui à l'avantage d'être explicite.Franchement même si je ne fais du C et du C++ tous les jours je sais que "^" représente un XOR et pas une élévation à la puissance...
Les développeurs qui font ce genre de confusion n'ont pas du tout révisé !!!
Perso, je vois mal les cas d'usage de ^ avec 2 constantes en base 10. Je serais curieux de connaître le nombre de code qui en font un usage justifié. J'ai regardé vite faire dans boost avec [0-9] *^ *[0-9] comme regex, à part les commentaires, rien.
Les avertissements fortement contestés ou dépendant d'un contexte ne sont pas activés par défaut et ne sont pas dans -Wall ou -Wextra. Par exemple, Il y a des avertissements pour l'héritage multiple, la création de namespace ou même l'utilisation de template et personne ne s'en plaind. Perso, j'ai plus le problème inverse: une ligne de commande à rallonge pour activer les warnings. Pour exemple voici uniquement la partie concernant les avertissements pour gcc-8: -pedantic -Waligned-new -Wall -Walloca -Walloc-zero -Warray-bounds=2 -Wcast-align -Wcast-qual -Wclass-memaccess -Wconditionally-supported -Wdisabled-optimization -Wdouble-promotion -Wduplicated-branches -Wduplicated-cond -Wextra -Wfloat-conversion -Wfloat-equal -Wformat=2 -Wformat-overflow=2 -Wformat-security -Wformat-signedness -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnon-virtual-dtor -Wno-shadow -Wnull-dereference -Wold-style-cast -Woverloaded-virtual -Wpacked -Wredundant-decls -Wstrict-null-sentinel -Wsuggest-attribute=noreturn -Wsuggest-override -Wtrampolines -Wundef -Wunused-macros -Wuseless-cast -Wzero-as-null-pointer-constant.le problème avec la multiplication de ces warnings, c'est la multiplication des faux-positifs ou pire des lignes de commandes à rallonge pour désactiver tous les warnings, et je trouve que c'est un problème pire que celui soulevé dans ce fil.
Après je ne la tape jamais, j'ai des alias et des fichiers générés qui prennent en compte chaque version des compilateurs.
Ça pue l'argument d'autorité.
Ce pourrait être Ken Thompson ou Brian Kernighan que j'en aurais rien à cirer. On juge une décision indépendamment de celui ou celle qui l'a émise.
Je suis contre ce warning.
Je trouve dégueulasse que soudainement on m'empêche de compiler mon programme (j'utilise souvent -Werror) pour avoir utilisé un opérateur de façon tout à fait légitime, sous prétexte que quelques personnes sont chagrinés par une petite erreur qu'ils ont l'impression de voir trop souvent. D'autant que ce n'est même pas une erreur qu'un développeur un minimum averti risque de faire, même par inadvertance.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager