- Das Chromium-Projekt definiert den Einsatzbereich und die verbotenen Elemente moderner C++-Standardfunktionen klar, um Code-Konsistenz und Sicherheit zu gewährleisten
- Für C++11 bis C++23 wird pro Standard zwischen erlaubt, verboten und in Prüfung (TBD) unterschieden; für die Abseil-Bibliothek gelten dieselben Kriterien
- Zu den verbotenen Funktionen gehören std::shared_ptr, std::function, std::regex, std::filesystem, std::byte, char8_t, modules
- Erlaubte Funktionen sind unter anderem concepts, der Spaceship-Operator, designated initializer, std::to_underlying, std::ranges-Algorithmen
- Dieser Leitfaden gilt für Chromium und alle Unterprojekte und dient als zentraler Maßstab zur Sicherstellung von Code-Stabilität und Build-Kompatibilität
Richtlinie für den Einsatz von Modern C++ in Chromium
- Chromium übernimmt neue C++-Standards nicht sofort, sondern markiert sie erst dann als anfänglich unterstützt (initially supported), wenn die Toolchain-Unterstützung ausreichend gesichert ist
- Danach werden einzelne Funktionen als erlaubt (allowed), verboten (banned) oder in Prüfung (TBD) eingestuft
- Änderungen am Status neuer Funktionen können über die Mailingliste cxx@chromium.org vorgeschlagen werden
- Zwei Jahre nach der anfänglichen Unterstützung werden Funktionen nach ausdrücklicher Prüfung in die Liste der erlaubten oder verbotenen Elemente verschoben
Verbotene Funktionen in C++11
- Sprachfunktionen: inline namespace, long long, benutzerdefinierte Literale (user-defined literals)
- Bibliotheksfunktionen:
<chrono>, <regex>, <random>-Engines, <exception>, <ratio>, <thread> usw.
- Ausnahmen (exceptions) sind vollständig deaktiviert; nur
noexcept ist erlaubt
- Anstelle von
std::bind, std::function, std::shared_ptr, std::weak_ptr werden base::Bind, base::Callback, base::RefCounted verwendet
Verbotene Funktionen in C++17
- UTF-8-Zeichenliterale (u8) sind verboten, wegen Kompatibilitätsproblemen mit
char8_t
- Verbotene Bibliothekselemente:
- mathematische Spezialfunktionen, parallele Algorithmen (parallel algorithms),
std::any, std::byte, std::filesystem, std::pmr-Speicherressourcen usw.
- Parallele Algorithmen sind wegen fehlender Unterstützung in libc++ und möglicher Konflikte mit dem Threading-Modell von Chrome verboten
Erlaubte und verbotene Funktionen in C++20
- Erlaubte Sprachfunktionen:
- concepts, consteval, designated initializers, der Spaceship-Operator, [[likely]], Initialisierung in range-for-Anweisungen
- Erlaubte Bibliotheksfunktionen:
<bit>, <compare>, <concepts>, <numbers>, std::erase_if, std::ranges::subrange, std::to_underlying usw.
- Verbotene Funktionen:
- char8_t, modules, [[no_unique_address]],
std::bit_cast, <span>, std::bind_front, std::ranges::view_interface
- In Prüfung (TBD): coroutine,
<format>, <source_location>, std::u8string
Erlaubte und in Prüfung befindliche Funktionen in C++23
- Erlaubte Sprachfunktionen:
#elifdef, if consteval, statischer Operator (static operator)
- Erlaubte Bibliotheksfunktionen:
std::byteswap, std::basic_string::contains, std::to_underlying, erweiterte std::ranges-Algorithmen
- In Prüfung befindliche Funktionen:
std::expected, std::mdspan, std::generator, std::stacktrace, std::print, [[assume]], #warning usw.
Richtlinie für die Abseil-Bibliothek
- Verbotene Abseil-Komponenten:
absl::any, absl::optional, absl::StatusOr, absl::Span, absl::FunctionRef, absl::Mutex, absl::Time, absl::btree_* usw.
- Die meisten davon werden durch Implementierungen im base-Namespace von Chromium ersetzt (
base::span, base::expected, base::Bind usw.)
- In Prüfung (TBD):
absl::linked_hash_set, absl::linked_hash_map
Gesamtbedeutung
- Chromium übernimmt Standard-C++-Funktionen nicht pauschal, sondern wählt sie anhand von Build-Stabilität, Sicherheit, Performance und Code-Konsistenz aus
- Die meisten verbotenen Funktionen sind entweder auf doppelte Implementierungen (base::) oder auf Probleme mit Toolchain- bzw. ABI-Kompatibilität zurückzuführen
- Dieser Leitfaden fungiert als Qualitätsmaßstab für C++-Code im Chromium-Ökosystem und ist bei der Open-Source-Zusammenarbeit ein unverzichtbares Referenzdokument
Noch keine Kommentare.