コンテンツにスキップ

最終更新:2026-10-12

C++ Insights によるコンパイル期観察

読者からよく聞かれるのは:range-for は一体何にコンパイルされるのか? lambda のキャプチャはメンバ変数そのものなのか? auto の推論ルールが覚えられない場合はどうすればいい? こうした質問の答えは実はすべてコンパイラの目に書かれていますが、普段は見えません。今日はその「コンパイラ視点」のコードを直接翻訳してくれるツールを紹介します:C++ Insights です。

1.何ですか

C++ Insights は Andreas Fertig が開発したオープンソースツール(GitHub)で、その本質は改造版 Clang です:C++ のソースコードを意味解析した後、等価だがすべて明示的な C++ に「逆コンパイル」し直します。最適化もせず、アセンブリも生成せず、「コンパイラが私の代わりに何を書いたのか」に答えるためだけに存在します。

2.何が見えるか

最もよく聞かれるシナリオをいくつか取り上げます。サイトを開いて下のコードを貼り付けて見比べることをおすすめします。

(1)range-for の正体:

std::vector<int> v{1, 2, 3};
for (auto x : v) {
  std::cout << x;
}

Insights は、それが実際には次のものだと教えてくれます:

{
  auto&& __range = v;
  for (auto __begin = __range.begin(), __end = __range.end();
       __begin != __end; ++__begin) {
    auto x = *__begin;
    std::cout << x;
  }
}

これは __range がダングリングした後にループの動作が未定義になる理由の説明にもなります。

(2)lambda は匿名クラスの operator() そのもの:

int base = 10;
auto add = [base](int x) { return base + x; };

展開後にはコンパイラが生成したクロージャ型とキャプチャメンバが見え、mutable、参照キャプチャと値キャプチャの違いがひと目でわかります。

(3)auto/decltype、構造化束縛、テンプレートのインスタンス化後の本当の型も、すべて明示化されます。

3.使い方

オンライン版:cppinsights.io。左にコードを貼ると右に結果が出ます。C++ 標準(11/14/17/20/23)も選べます。

コマンドライン版はローカルにインストールできます:

git clone https://github.com/andreasfertig/cppinsights
cd cppinsights && mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j8

ビルドしてできた insights バイナリは、そのままファイルに対して使えます:insights hello.cpp -- -std=c++20。

4.まとめ

記事を書くとき、発表をするとき、面接の準備をするとき、Insights は「コンパイラが実際に何をしたか」を検証する最速の手段で、ルールを暗記するよりずっと確実です。質問があればコメント欄でどうぞ〜

関連トピック

コメント