Considérez ceci compilé dans MS Visual Studio 2005 (et probablement d'autres):Quand est un bool pas un bool (compilateur C4800 avisent)
CPoint point1(1, 2);
CPoint point2(3, 4);
const bool point1And2Identical(point1 == point2); // C4800 warning
const bool point1And2TheSame((point1 == point2) == TRUE); // no warning
Qu'est-ce que ...? Le compilateur MSVC est-il mort? Pour autant que je sache, TRUE est # défini comme 1, sans aucune information de type. Alors par quelle magie y a-t-il une différence entre ces deux lignes? Sûrement le type de l'expression à l'intérieur des parenthèses est le même dans les deux cas? Personnellement, je pense qu'éviter l'avertissement en utilisant l'option == TRUE est moche (mais moins moche que l'alternative! = 0, en dépit d'être plus strictement correct), et il est préférable d'utiliser #pragma warning (disable: 4800) pour impliquer "mon code est bon, le compilateur est un âne". Se mettre d'accord? Note - J'ai vu toutes sortes de discussions sur C4800 parler d'assigner des ints à des booléens, ou de lancer un combo de hamburger avec de grandes frites (tenir les oignons) à un bool, et se demander pourquoi il y a des résultats étranges. Je ne peux pas trouver une réponse claire sur ce qui semble être une question beaucoup plus simple ... qui pourrait juste briller ligne sur C4800 en général.
Recherchez la déclaration de 'operator ==' liée à la classe 'CPoint'. – aschepler
Non - vous le cherchez :-) Je n'ai pas trouvé de magie du tout - operator == renvoie un BOOL qui est un typedef à un int. Pour autant que je sache, int == TRUE est toujours un int. – omatai
Sur les types intégrés, '==' donne un 'bool', pas un' BOOL'. – aschepler