- Le projet Chromium définit clairement le périmètre d’utilisation et les éléments interdits des fonctionnalités des standards C++ récents afin de préserver la cohérence du code et la sécurité
- De C++11 à C++23, chaque standard distingue les états autorisé, interdit et à examiner (TBD), et la bibliothèque Abseil est soumise aux mêmes critères
- Parmi les fonctionnalités interdites figurent std::shared_ptr, std::function, std::regex, std::filesystem, std::byte, char8_t, modules, etc.
- Parmi les fonctionnalités autorisées figurent concepts, l’opérateur spaceship, designated initializer, std::to_underlying, les algorithmes std::ranges, etc.
- Ce guide s’applique à Chromium et à l’ensemble de ses sous-projets, et sert de référence clé pour garantir la stabilité du code et la compatibilité de build
Politique d’utilisation du C++ moderne dans Chromium
- Chromium n’adopte pas immédiatement les nouveaux standards C++ et les classe en état « initially supported » uniquement une fois que le support de la toolchain est suffisamment assuré
- Les fonctionnalités sont ensuite classées selon les statuts autorisé (allowed), interdit (banned) et à examiner (TBD)
- Les propositions de changement de statut pour une nouvelle fonctionnalité peuvent être soumises via la mailing list cxx@chromium.org
- Deux ans après le support initial, chaque fonctionnalité est déplacée vers la liste des éléments autorisés ou interdits après examen explicite
Fonctionnalités interdites de C++11
- Fonctionnalités du langage : inline namespace, long long, user-defined literals
- Fonctionnalités de bibliothèque :
<chrono>, <regex>, <random> engines, <exception>, <ratio>, <thread>, etc.
- Les exceptions sont entièrement désactivées, et seul
noexcept est autorisé
- À la place de
std::bind, std::function, std::shared_ptr, std::weak_ptr, Chromium utilise base::Bind, base::Callback, base::RefCounted
Fonctionnalités interdites de C++17
- Les littéraux de caractères UTF-8 (u8) sont interdits en raison de problèmes de compatibilité avec
char8_t
- Éléments de bibliothèque interdits :
- fonctions mathématiques spéciales, algorithmes parallèles,
std::any, std::byte, std::filesystem, ressources mémoire std::pmr, etc.
- Les algorithmes parallèles sont interdits en raison de l’absence de prise en charge dans libc++ et de craintes de conflit avec le modèle de threading de Chrome
Fonctionnalités autorisées et interdites de C++20
- Fonctionnalités du langage autorisées :
- concepts, consteval, designated initializers, l’opérateur spaceship, [[likely]], la syntaxe d’initialisation de range-for
- Fonctionnalités de bibliothèque autorisées :
<bit>, <compare>, <concepts>, <numbers>, std::erase_if, std::ranges::subrange, std::to_underlying, etc.
- Fonctionnalités interdites :
- char8_t, modules, [[no_unique_address]],
std::bit_cast, <span>, std::bind_front, std::ranges::view_interface
- À examiner (TBD) : coroutine,
<format>, <source_location>, std::u8string
Fonctionnalités autorisées et à examiner de C++23
- Fonctionnalités du langage autorisées :
#elifdef, if consteval, static operator
- Fonctionnalités de bibliothèque autorisées :
std::byteswap, std::basic_string::contains, std::to_underlying, extensions des algorithmes std::ranges
- Fonctionnalités à examiner :
std::expected, std::mdspan, std::generator, std::stacktrace, std::print, [[assume]], #warning, etc.
Politique pour la bibliothèque Abseil
- Composants Abseil interdits :
absl::any, absl::optional, absl::StatusOr, absl::Span, absl::FunctionRef, absl::Mutex, absl::Time, absl::btree_*, etc.
- La plupart sont remplacés par les implémentations du namespace base de Chromium (
base::span, base::expected, base::Bind, etc.)
- À examiner (TBD) :
absl::linked_hash_set, absl::linked_hash_map
Sens général
- Chromium n’accepte pas automatiquement les fonctionnalités du C++ standard et les applique de façon sélective selon des critères de stabilité de build, de sécurité, de performance et de cohérence du code
- La plupart des fonctionnalités interdites le sont à cause de doublons d’implémentation (
base::) ou de problèmes de toolchain et de compatibilité ABI
- Ce guide sert de référentiel de gestion de la qualité du code C++ dans l’écosystème Chromium et constitue un document de référence indispensable pour la collaboration open source
Aucun commentaire pour le moment.