Bonjour à tous,
J'ouvre ce sujet à la suite de cette discussion et il ne traitera pas spécifiquement des enums :
http://www.developpez.net/forums/d13...tout-a-fait-x/
L'objectif de cette discussion n'est pas de savoir ce que dit la norme ni de ce que font actuellement les différents compilateurs, mais de savoir ce que vous trouvez logique comme comportements et pourquoi.
Je vous proposes un code relativement simple contenant 6 appels à 3 fonctions surchargés :
La question est de savoir ce que vous, développeur, attendez de ces appels de manière logique. Les réponses possibles sont :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 #include<iostream> enum : short { val_short }; enum : int { val_int }; void short_or_int(short) { std::cout << "short"; } void short_or_int(int) { std::cout << "int"; } void int_or_long(int) { std::cout << "int"; } void int_or_long(long) { std::cout << "long"; } void long_or_longlong(long) { std::cout << "long"; } void long_or_longlong(long long) { std::cout << "longlong"; } int main() { short var_short(0); int var_int (0); std::cout << "short_or_int with var_short : "; short_or_int(var_short) ; std::cout << std::endl; std::cout << "int_or_long with var_short : "; int_or_long(var_short) ; std::cout << std::endl; std::cout << "long_or_longlong with var_int : "; long_or_longlong(var_int); std::cout << std::endl; std::cout << "short_or_int with val_short : "; short_or_int(val_short) ; std::cout << std::endl; std::cout << "int_or_long with val_short : "; int_or_long(val_short) ; std::cout << std::endl; std::cout << "int with val_int : "; long_or_longlong(val_int); std::cout << std::endl; }
- L'appel ne doit pas compiler car aucune fonction ne correspond aux arguments.
- L'appel ne doit pas compiler car il y a ambiguïté, plusieurs surcharges correspondent et aucune n'est à privilégier.
- L'appel est valide car une seule surcharge correspond aux arguments.
- L'appel est valide car plusieurs surcharges correspondent aux arguments mais une seule est à privilégier.
L'objectif n'est pas de déterminer ce qu'il doit se passer en réalité, seulement de discuter de ce qui doit se passer de la manière la plus logique qui soit.
Les trois premiers appels ne font pas usage des notions d'énumérations avec type sous-jacent explicitent du C++11, ils sont plus classiques mais cependant pas nécessairement dénués d'intérêt. Les trois derniers appels utilisent ces énumérations ce qui peut introduire des raisonnements différents.
Je rappel juste deux choses :
- Les types entiers ont en C++ un certain "ordre" entre eux, ce n'est pas nécessaire de rentrer dans les détails ici, il est juste à noter que short < int < long < long long, où < désigne cet ordre.
- Les énumérations définissent un nouveau type, ainsi le type de val_short et val_int n'est ni short ni int, c'est autre chose (le type est non nommé ici). Le type sous-jacent (respectivement short et int) est le type des valeurs de l'énumération à l'intérieur de celle-ci, à l'extérieur ils ont le type définit par l'énumération.
Bien entendu il sera intéressant dans la suite de la discussion de s'interroger sur ce qu'il doit se passer selon la norme et de le confronter aux premières intuitions.
Partager