15 ポイント 投稿者 GN⁺ 2026-01-26 | 3件のコメント | WhatsAppで共有
  • Chromiumプロジェクトは、最新のC++標準機能の使用範囲と禁止項目を明確に定義し、コードの一貫性と安全性を維持している
  • C++11〜C++23まで、各標準ごとに許可・禁止・検討中(TBD)の状態が区分され、Abseilライブラリにも同じ基準が適用される
  • 禁止されている機能には std::shared_ptr, std::function, std::regex, std::filesystem, std::byte, char8_t, modules などが含まれる
  • 許可されている機能には concepts, spaceship演算子, designated initializer, std::to_underlying, std::rangesアルゴリズム などがある
  • このガイドは Chromium とその下位プロジェクト全体に適用され、コードの安定性とビルド互換性の確保のための中核的な基準として機能する

ChromiumのModern C++利用ポリシー

  • Chromiumは最新のC++標準をすぐには導入せず、ツールチェーンのサポートが十分に確保された後に「初期サポート(initially supported)」状態として指定する
    • その後、機能ごとに 許可(allowed)禁止(banned)検討中(TBD) に分類される
  • 新しい機能の状態変更は cxx@chromium.org メーリングリストを通じて提案できる
  • 初期サポートから2年が経過すると、明示的なレビューを経て許可または禁止の一覧へ移される

C++11で禁止されている機能

  • 言語機能: inline namespace, long long, ユーザー定義リテラル(user-defined literals)
  • ライブラリ機能: <chrono>, <regex>, <random> エンジン, <exception>, <ratio>, <thread> など
    • 例外(exception)は完全に無効化されており、noexcept のみ許可される
    • std::bind, std::function, std::shared_ptr, std::weak_ptr の代わりに base::Bind, base::Callback, base::RefCounted を使用する

C++17で禁止されている機能

  • **UTF-8文字リテラル(u8)**は禁止。char8_t との互換性の問題があるため
  • ライブラリの禁止項目:
    • 数学の特殊関数、並列アルゴリズム(parallel algorithms)、std::any, std::byte, std::filesystem, std::pmr メモリリソースなど
    • 並列アルゴリズムは libc++ が未対応であり、Chromeのスレッドモデルと衝突する懸念があるため禁止

C++20の許可機能と禁止機能

  • 許可されている言語機能:
    • concepts, consteval, designated initializers, spaceship演算子, [[likely]], range-for初期化構文
  • 許可されているライブラリ機能:
    • <bit>, <compare>, <concepts>, <numbers>, std::erase_if, std::ranges::subrange, std::to_underlying など
  • 禁止されている機能:
    • char8_t, modules, [[no_unique_address]], std::bit_cast, <span>, std::bind_front, std::ranges::view_interface
  • 検討中(TBD): coroutine, <format>, <source_location>, std::u8string

C++23の許可機能と検討中の機能

  • 許可されている言語機能: #elifdef, if consteval, 静的演算子(static operator)
  • 許可されているライブラリ機能: std::byteswap, std::basic_string::contains, std::to_underlying, std::ranges 拡張アルゴリズム
  • 検討中の機能: std::expected, std::mdspan, std::generator, std::stacktrace, std::print, [[assume]], #warning など

Abseilライブラリのポリシー

  • 禁止されているAbseilコンポーネント:
    • absl::any, absl::optional, absl::StatusOr, absl::Span, absl::FunctionRef, absl::Mutex, absl::Time, absl::btree_* など
    • その多くは Chromium の base名前空間の実装で置き換えられる(base::span, base::expected, base::Bind など)
  • 検討中(TBD): absl::linked_hash_set, absl::linked_hash_map

全体的な意味

  • Chromiumは標準C++機能を無条件に受け入れるのではなく、ビルドの安定性・セキュリティ・性能・コードの一貫性を基準に選別して適用している
  • 禁止されている機能の大半は 重複実装(base::) または ツールチェーン・ABI互換性の問題 によるもの
  • このガイドは Chromium エコシステムにおける C++コード品質管理の基準文書であり、オープンソース協業時の必須の参照文書として機能する

3件のコメント

 
karikera 2026-01-27

C++は下位互換性のために言語がどんどん肥大化していくのが残念です……

 
tsboard 2026-01-26

本当にHNの意見にある言葉の通り、C++は巨大な言語です...

 
GN⁺ 2026-01-26
Hacker Newsのコメント
  • 特に目立つものはないが、大半は「自分たちの用途に合う社内製ライブラリを使おう」という趣旨の内容だと思う
    残りも、ロケール問題を避けるなど妥当なものが多い。標準ライブラリの荒い部分を整えるための選択肢もあって納得できる

    • 古いコードベースを持つ会社ではこういうケースをよく見る。昔はchronoがなかったので独自の時間型を作り、STLが安定する前から独自コンテナを使っていた
      いま新規プロジェクトを始めるなら、こうしたルールの大半は意味がない気がする
    • char8_tが禁止されている理由は興味深い。UTF-8以外のエンコーディングはほとんどなく、char8_t*char*と互換性がないので、キャストの乱立を防ぐためにstd::stringstd::string_viewを使うよう勧めている
    • 10年以上このページを管理していた立場からすると、この文書が同じ日にr/c++とHNへ同時に投稿されたのは不思議だ。特に新しい内容はないのに、なぜ話題になったのか気になる
    • 単なる惰性ではなく、Googleの実装のほうが標準より厳密に優れた設計になっている部分もある。標準型のほうがもっと良く設計されていてもよかったはずだ
    • Google内部には、ほぼあらゆる技術に独自版があるという認識がある。問題は、一部の人がそれを盲目的にまねして文脈を失うことだ。20人の開発者で50のサービスを持つ組織がKubernetesを導入するのが典型例だ
  • 古いコードの話を見て、Chromiumが最初に出た頃を思い出した
    このコードベースがもう20年前に始まったという事実に改めて驚く

  • <regex>が禁止されているのは良い判断だ。UTF-8をきちんと扱えず、使いものにならなかった。こんな欠陥ある設計が標準化されたのは驚きだ

    • 最近のregexライブラリの多くはUnicodeモードをサポートしている。regex自体、UTF-8より先に生まれた技術だ
  • 上位ディレクトリにはもっと興味深い文書がある
    Chromium C++スタイルガイド は参考になる

  • 例外(Exception)は禁止されているが、Windowsだけは例外になっている

    • GoogleのコードはもともとCスタイルベースなので例外安全ではない。新しく始めるなら例外を使うほうがよいが、既存コードとの互換性のため難しい、という説明だ
      例外を哲学的に反対しているのではなく、実用的な理由で禁止している。最初からやり直すなら違っていただろうとのことだ
    • この文書はGoogle Style Guideではなく、Chromium Modern C++ Features文書だ。例外やプラットフォーム別の内容は扱っていない
    • “exception”と“Windows”でgrepしてみたが、[[no_unique_address]]に関する言及しかなかったので、たぶん冗談を取り逃したのだと思う
  • 禁止機能の一覧が多すぎて、C全体の機能より多く見える。圧倒的だ

    • C++は本当に巨大な言語
  • u8"..."リテラルを禁止したのは良い判断だ。ソース自体をUTF-8で書けば、別に接頭辞は不要だ
    こういうリテラルは問題より先に解決策が出てきた例だ

  • 禁止された機能の代替手段を知りたい。たとえば<filesystem>はテスト支援が不十分で、セキュリティ脆弱性があるとされている

    • ほとんどの禁止項目にはすぐ横に代替ライブラリが明記されている。<filesystem>だけが例外だ
    • おそらくChromium開発者ドキュメントに関連情報があると思う
    • たいていはbase/filesを使う
  • モジュール(Modules)は禁止されている。いっそD言語のモジュールシステムをコピーすればよかったのにと思う

    • その理由はコンパイラ対応不足
  • 禁止リストは、「最新機能より文脈のほうが重要」であることを示している。小さなアプリでは問題なくても、大規模プロジェクトでは危険だ

    • Googleのガイドラインの核心は、言語の専門家でなくても安全に貢献できるようにすることだ。つまり、プロジェクトの規模より組織的な一貫性が目的だ
      さまざまなプラットフォーム間の移植性も考慮されている
    • 歴史的理由や互換性のために独自実装を維持しているケースも多い。標準化以前から存在した機能なので置き換えにくいのだ
    • 私も新機能をあちこちに混ぜるより、既存ルールに合わせて一貫性を保つほうが、読む側の負担が少ないと思う