HeadlinesBriefing HeadlinesBriefing.com

Opérations de masquage de bits et promotion entière en C++

Hacker News •
×

J'ai récemment examiné P4313 R1, une proposition de norme ajoutant des opérations de masquage de bits pour les énumérations via une annotation C++26. Le concept central utilise `[[=std::bitmask_type]]` pour générer automatiquement les opérateurs bit à bit, éliminant ainsi l'implémentation manuelle. Bien que les compilateurs C++ calculent heureusement les opérations bit à bit sur les types entiers, un détail critique implique la promotion entière.

Les types plus petits que `int`, comme `short`, subissent une promotion vers `int` avant que l'opération ne s'effectue. Cela signifie que le type de résultat des opérations sur les types plus petits est par défaut `int`, nécessitant un `static_cast` vers le type original pour éviter les comportements inattendus. De plus, `bool` présente des risques uniques.

La conversion booléenne ne tronque pas les motifs de bits ; elle mappe plutôt toute valeur non nulle à `true` (valeur entière 1) et zéro à `false`. Combinant ces règles révèle un étrange phénomène : le complément de `true` (`~true`) promeut `true` à `int` (valeur 1), calcule le résultat du complément à deux comme `-2`, et puisque `-2` est non nul, la conversion booléenne retourne `true`. Par conséquent, `static_cast(~true) == true`.

Ce comportement s'étend aux énumérations basées sur `bool`, comme celles définies avec `[[=std::bitmask_type]]`, soulignant l'importance de comprendre ces conversions implicites pour un développement C++ robuste.

Source: Hacker News · Résumé par HeadlinesBriefing