概要
- Chromium C++スタイルガイドの一部であり、近年のC++標準およびAbseilライブラリの新機能・更新機能のサポート状況をまとめた内容
- Chromiumおよびサブプロジェクトに適用され、サブプロジェクトは必要に応じてより制限的な方針を採用可能
- 新標準の機能は即時利用不可、ツールチェーン対応後に「初期サポート」段階を経て、議論後に許可・禁止が決定
- 禁止機能やサードパーティコードの扱い、機能の許可・禁止提案の流れも明記
- 各C++バージョン・Abseilの許可・禁止機能リストあり
Chromium C++ 標準機能・ライブラリ機能 サポート方針まとめ
- C++標準 は3年ごとに更新、 Chromium は即時採用せず、 ツールチェーン対応 後に「初期サポート」宣言
- 「初期サポート」状態では 新機能は原則禁止、議論を経て許可・禁止を決定
- 機能の許可・禁止変更提案 はcxx@chromium.orgへメールで申請、議論合意後にファイルを修正
- TBDリスト の項目は2年経過後に明示的に許可リストまたは禁止リストへ移動
- サードパーティライブラリ は原則内部で禁止機能利用可能だが、 セキュリティやコンパイラサポート に問題ある場合は利用不可
C++標準・Abseilのサポート状況
- C++11: デフォルト許可、ただし一部禁止機能あり
- C++14: デフォルト許可
- C++17: デフォルト許可、一部禁止機能あり
- C++20: 2023年11月13日より初期サポート、許可・禁止・TBD機能あり
- C++23: 2026年1月より初期サポート予定
- C++26: 未サポート
- Abseil: デフォルト許可、一部禁止・TBD機能あり
禁止機能およびサードパーティコードの扱い
- サードパーティライブラリ は内部で禁止機能利用可能
- ただし コンパイラサポート不十分 または セキュリティ問題 がある場合は利用不可
- Chromiumコードがサードパーティの禁止型をインターフェースで利用する場合、 即座に許可型へ変換 が必要
- セキュリティやコンパイラサポート理由で禁止されている場合は、 cxx@chromium.org と相談
C++11 禁止言語機能
- インライン名前空間 (inline namespace): バージョン管理向け機能、Google Style Guideで禁止
- long long型: 64ビット以上の整数型
- ユーザー定義リテラル: 独自リテラル表現の定義
C++11 禁止ライブラリ機能
- <cctype>, <ctype.h>, <cwctype>, <wctype.h>: ASCII文字ユーティリティ、Cロケール依存と未定義動作のため禁止、 absl/strings/ascii.h を代用
- <cfenv>, <fenv.h>: 浮動小数点制御
- <chrono>: 日付・時刻ライブラリ、base/timeと重複
- <exception>: 例外処理
- <random>のエンジン・ジェネレータ: 疑似乱数生成
- <ratio>: コンパイル時有理数、Google Style Guideで禁止
- <regex>: 正規表現、Chromium内の他ライブラリと重複、 third_party/re2 推奨
- std::aligned_{storage,union}: アラインメント確保、C++23で非推奨、 alignas(T) char buf[sizeof(T)] を推奨
- std::bind: 関数オブジェクト生成
- std::function: 多態関数ラッパー
- std::shared_ptr / std::weak_ptr: 共有・弱参照ポインタ、base::WeakPtrを推奨
- *std::{sto,to_string}**: 文字列と数値変換、例外依存やパフォーマンス問題、 base/strings/string_number_conversions.h を推奨
- スレッドサポートライブラリ: <barrier>, <condition_variable>, <future>, <latch>, <mutex>, <semaphore>, <stop_token>, <thread>、base/synchronizationと重複、base::Thread推奨
C++17 禁止言語機能
- UTF-8文字リテラル (u8'X'等): char8_t禁止のため、未修飾リテラルを推奨
C++17 禁止ライブラリ機能
- 数学特殊関数: std::assoc_laguerre等、多数
- 並列アルゴリズム: std::execution::par等、libc++サポート不完全、Chromeのスケジューラ・スレッドAPI利用を推奨
- std::aligned_alloc: アラインメント確保
- std::any: 型安全な汎用コンテナ
- std::byte: バイト表現
- std::filesystem: ファイルシステム操作
- std::{from,to}_chars: 文字列と数値変換、base/strings/string_number_conversions.hと重複
- std::{pmr::memory_resource, polymorphic_allocator}: メモリリソース管理、PartitionAlloc利用のため不要
- std::timespec_get: 時刻取得、base::TimeDelta::ToTimeSpec()利用推奨
- std::uncaught_exceptions: 例外数取得、例外禁止のため
- 透明なstd::owner_less: std::shared_ptr/weak_ptrが禁止のため
- weak_from_this: std::shared_ptr/weak_ptrが禁止のため
機能の許可・禁止の議論と管理
- 新機能の許可・禁止提案 はcxx@chromium.orgにメール送付
- 機能の説明、許可・禁止理由、過去議論のリンクを添付
- 合意形成後、 コードレビューでファイル修正、議論スレッドへのリンク必須
- TBDリスト に2年以上残った場合、明示的に許可または禁止へ分類
推奨代替・注意事項
- 文字列・数値変換: base/strings/string_number_conversions.h
- ASCII文字ユーティリティ: absl/strings/ascii.h
- 正規表現: third_party/re2
- スレッド・同期: base/synchronization, base::Thread
- 共有・弱参照ポインタ: base::WeakPtr
まとめ
- Chromium C++開発 では、 標準機能の利用制限 と 独自の推奨実装 を明確に定義
- セキュリティ・移植性・パフォーマンス 重視の方針
- 新機能利用には合意形成・明確な手続き が必要
- サードパーティ・独自実装の活用 と 標準ライブラリの取捨選択 が特徴