
2026/01/24 5:27
**Chromium で禁止されている C++ 機能** 1. **`goto`** - `goto` 文は使用しないでください。制御フローが追跡しづらくなるためです。 2. **`setjmp` / `longjmp`** - これらの非ローカルジャンプは例外安全性を破壊するため、禁止されています。 3. **C++ 標準ライブラリの例外** - `std::exception` や `std::runtime_error` などの標準例外を投げたり捕捉したりしないでください。代わりに Chromium のエラーハンドリング機構を利用してください。 4. **非トリビアルデストラクタ付きの `new` / `delete`** - スマートポインタ (`std::unique_ptr`, `std::shared_ptr`) やスタック割当てを優先し、複雑なクリーンアップが必要な生の動的メモリは禁止です。 5. **`malloc` / `free`** - C 風の割り当て関数ではなく、Chromium のメモリアロケータ(例:`base::Malloc`, `new`/`delete`)を使用してください。 6. **`std::mutex` と関連スレッドプリミティブ** - Chromium コードベースは独自のスレッド安全抽象 (`base::Lock`, `base::WaitableEvent`) を用いるため、標準ライブラリのミューテックスは避けてください。 7. **`thread_local` ストレージ期間** - C++11 の `thread_local` ではなく、Chromium のスレッドローカルユーティリティ(`THREAD_LOCAL`)を使用してください。 8. **C++ RTTI (ランタイム型情報)** - RTTI を無効化 (`-fno-rtti`)し、`dynamic_cast`, `typeid` は使わないでください。Chromium の型識別メカニズムを利用しましょう。 9. **コンパイル時に評価できない `static_assert`** - すべての `static_assert` はコンパイル時に解決可能な式である必要があります。実行時チェックは `DCHECK` を使用してください。 10. **メモリ割り当てや副作用を伴う `constexpr` 関数** - `constexpr` は定数式評価のみに限定されるため、内部で動的割り当てや副作用を持つコードは避けてください。 11. **大きなキャプチャを持つ `std::function`** - ヘッジ上のコールバックとして `base::OnceCallback`, `base::RepeatingCallback` など軽量なものを優先し、ヒープ使用量を抑えてください。 12. **グローバルまたはクラス固有の `operator new/delete` オーバーロード** - これらのオーバーロードは禁止されており、Chromium のアロケータ API を利用してください。 これらの制限により、Chromium プロジェクト全体でコードの一貫性・パフォーマンス・プラットフォーム互換性を保つことができます。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
要約
Chromium は、コードベースで使用できる C++ 言語機能とライブラリ機能を指定する詳細なスタイルガイドを採用しています。機能は 許可済み(allowed)、禁止(banned)、または 未定(TBD)に分類され、サポート対象となる各標準ごとに設定されています:C++11/14/17 は一般的に許可されており、C++20 は 2023 年 11 月 13 日に追加され、包括的な allow/block/TBD テーブルが提供されています。C++23 のサポートは 2026 年 1 月から開始し、C++26 はまだサポート対象外です。多くの Abseil コンポーネントは採用されていますが、Chromium 自身のユーティリティと重複するものや安全性に懸念があるもの(例:std::any、std::optional、乱数生成器などの早期バックポート)については禁止または TBD とされています。
禁止されている言語機能には、C++11 での inline namespace、long long、ユーザー定義リテラルが含まれます。C++17 では UTF‑8 文字リテラル、並列アルゴリズム、std::filesystem などが禁止または TBD とされています。
今後の作業としては、追加の C++23 機能を評価し、承認・禁止・TBD のいずれかに決定すること、および互換性が確認できた場合にはさらに Abseil モジュールを検討する可能性があります。
Chromium に貢献する開発者は、これらのルールがすべての新規コード追加およびサードパーティ統合に適用されるため、ABI の安定性、一貫したツールチェーン使用、および大規模な分散プロジェクト全体での安全性を確保することになります。
本文
Chromium C++ スタイルガイド – サポート機能の概要
全体像
- 本ガイドは、最新のC++標準およびAbseilライブラリにおける新規・更新された言語/ライブラリ機能のサポート状況をまとめたものです。
- Chromium 及びそのサブプロジェクトへ適用されますが、ツールチェーン上で必要な場合はサブプロジェクト側でより厳格に設定することもあります。
機能ステータス
| 標準 | デフォルト許可 | 初期サポート日 | 備考 |
|---|---|---|---|
| C++11 | ✔︎(以下の禁止機能を除く) | — | |
| C++14 | ✔︎ | — | |
| C++17 | ✔︎(以下の禁止機能を除く) | — | |
| C++20 | 初期サポート (2023年11月13日) | TBDリスト以下 | |
| C++23 | 初期サポート (2026年1月) | TBDリスト以下 | |
| C++26 | ❌ | — | 未対応 |
| Abseil | ✔︎(禁止/TBD機能を除く) | — |
一般ルール
- 禁止機能:Chromiumコードでは使用不可。
- 許可機能:自由に使用可能。
- TBD機能:決定されるまで TBD リストに残す。
- 第三者コードは内部で禁止機能を利用できても、Chrome がそれらを公開インタフェースとして露出させてはならない(安全な変換が行われた場合のみ許可)。
C++11 禁止言語機能
| 機能 | 例 | 理由 |
|---|---|---|
| | Google スタイルガイドで禁止。コンポーネントとの整合性が不明。 |
| | を使用する方が望ましい。 |
| ユーザー定義リテラル | | 許可されていない。 |
C++11 禁止ライブラリ機能
| ヘッダ/機能 | 例 | 理由 |
|---|---|---|
, 等 | | Cロケールに依存し、 を超える引数で未定義動作。Abseil の を使用。 |
/ | | 必要ない。プラットフォームヘッダを利用。 |
| | と重複。 |
| | 例外は禁止。 |
ランダム生成器 () | | を使用。 |
| | テンプレートが重く、Google スタイルガイドで禁止。 |
| | RE2 と重複。RE2 を利用。 |
, , 等 | 例示あり | , 等の代替を推奨。 |
, | | Chromium の を使用。 |
文字列変換関数 (, ) | | を推奨。 |
スレッドサポートライブラリヘッダ (, 等) | | と重複。Chromium の API を使用。 |
C++17 禁止言語機能
| 機能 | 例 | 理由 |
|---|---|---|
UTF-8 文字リテラル () | | は禁止。純粋な を使用。 |
C++17 禁止ライブラリ機能
| ヘッダ/機能 | 例 | 理由 |
|---|---|---|
数学的特殊関数 (, 等) | | 必要ない。 |
並列アルゴリズム () | | Libc++ のサポートが不完全。Chrome のスレッド API を使用。 |
| | プラットフォーム固有のアロケータを優先。 |
, , 等 | 例示あり | Chromium の等価機能を使用、または回避。 |
| | を推奨。 |
C++20 許可言語機能
- 省略関数テンプレート (
パラメータ,auto
, 変数長C auto
)auto...
関数consteval- 概念と制約(例:
)Hashable - デフォルト比較 (
)operator== = default; operator<=> = default; - 設計子イニシャライザ (
)S s{ .y = 3 }; - 属性テスト (
)__has_cpp_attribute(assume)
変数constinit- ビットフィールドイニシャライザ
- ラベル付きリカバリキャプチャ付きラムダ
- 機能テストマクロ (
)#if !defined(__cpp_modules) || (__cpp_modules < 201907L) …
,[[likely]]
属性[[unlikely]]- 初期化子付き range‑for 文(C++23 前)
- 三項比較演算子 (
)<=> - 列挙型宣言の using
C++20 許可ライブラリ機能
| ヘッダ | 理由 |
|---|---|
| ビット操作ユーティリティ。 |
| 三項比較をサポート。 |
| 有用な概念を提供。 |
Ranges アルゴリズム () | 範囲ベースの処理。 |
| 機能テストマクロ。 |
| 数学定数。 |
| ポインタ整列ヒント。 |
, | コンテナ操作。 |
| 偽共有を避ける。 |
, | 型特性。 |
| 線形補間。 |
, , | アロケータユーティリティ。 |
| 範囲ビュー。 |
| 修飾子除去。 |
| コンテナの符号付きサイズ。 |
, | 文字列ヘルパー。 |
C++20 禁止言語機能
:純粋なchar8_t
を優先。char- モジュール (
) – Clang/GN で未サポート。export module …
– Chromium の[[no_unique_address]]
マクロを使用。NO_UNIQUE_ADDRESS
C++20 禁止ライブラリ機能
| ヘッダ/機能 | 例 | 理由 |
|---|---|---|
| | と重複。 |
| | を使用。 |
UTF‑8 変換関数 (, ) | 例示コード | Cロケールに依存し、回避すべき。 |
Ranges ファクトリ/アダプタ(, 等) | パイプライン例 | Chromium の範囲ユーティリティを優先。 |
| | を使用。 |
| | マルチスレッドストリームは不要。 |
C++20 TBD 言語機能
- 構造体の括弧付き集約初期化 (
) – 潜在的な問題点。B b2(1, 1); - コルーチン (
等) – 大規模サポートが必要。co_return
C++20 TBD ライブラリ機能
,<coroutine>
,<format>
,<source_location>
などはまだ統合されていない。<u8string>
C++23 許可言語機能
- 新しいプリプロセッサディレクティブ:
,#elifdef
.#elifndef
C++23 許可ライブラリ機能
| 機能 | 例 | 理由 |
|---|---|---|
| | サブストリングチェックが簡潔。 |
| | バイトオーダー操作。 |
| | 列挙型を基底型へ変換。 |
C++23 TBD 言語機能
- 明示的オブジェクトパラメータ (
)void f(this S& self) - 多次元添字演算子
- Auto キャスト (
)auto(x)
属性、[[assume]]
ディレクティブ、リテラルサフィックス、名前付き文字エスケープ – 全てレビュー待ち。#warning
C++23 TBD ライブラリ機能
- オプションモナド操作(
,and_then
,transform
)or_else
, フラットコンテナ (<expected>
等)flat_map
,<out_ptr><inout_ptr>- 多次元配列ビュー (
)<mdspan> - Ranges 変換 (
)、フォーマットユーティリティ、スタックトレース、ムーブオンリー関数、到達不能ヒント、spanstream、固定幅浮動小数点、ライフタイムヘルパー。std::ranges::to
Abseil 禁止ライブラリ機能
| 機能 | 例 | 理由 |
|---|---|---|
, | C++17 のバックポート | 標準 (, ) を優先。 |
, | Chromium コールバックと重複 | Chromium のコールバック型を使用。 |
属性マクロ(例:) | クロスプラットフォーム属性 | Chromium 等価を優先。 |
Btree コンテナ (, など) | 性能上の問題 | 標準ライブラリコンテナを使用。 |
| と重複 | Chromium の を利用。 |
コマンドラインフラグ () | フラグ処理 | Chromium のフラグシステムを使用。 |
固定配列 () | 未初期化の UB リスク | を利用。 |
ロギングマクロ(, 等) | Chromium のロギングと重複 | Chromium のロギングを使用。 |
| デストラクタ抑制 | を使用。 |
Nullability アノテーション () | 強制力なし | 避けるべき。 |
| と重複 | Chromium のエラーハンドリングを優先。 |
, 文字列ユーティリティ(例:, ) | 、Chromium 文字列と重複 | 標準または Chromium 等価を使用。 |
同期プリミティブ () | Chromium の同期プリミティブと重複 | Chromium を利用。 |
時間ライブラリ ( など) | Chromium 時間型と重複 | Chromium 時間型を優先。 |
バリアントユーティリティ (, ) | 標準バリアントへのエイリアス | 標準ライブラリを使用。 |
ユーティリティ関数(, など) | 標準に対するエイリアス | 標準ライブラリを利用。 |
Abseil TBD 機能
- リンクドハッシュコンテナ (
,absl::linked_hash_set
)absl::linked_hash_map
挿入順保持のセット/マップを提供しますが、現在は TBD リストにあり評価待ちです。
機能ステータスの更新手順
- 提案:
に簡潔な説明と根拠をメールで送信。cxx@chromium.org - 議論:関連スレッドやドキュメントへのリンクを添付。
- コードレビュー:合意に達したらこのファイルの変更レビューを提出。
- TBD リスト管理:初期サポート後 2 年間 TBD のままの場合は、明示的に許可/禁止リストへ移行。