Перейти к содержанию

Последнее обновление:2026-10-12

C++ Insights: взгляд на этап компиляции

Читатели часто спрашивают меня: во что же реально компилируется range-for? Захваты лямбды — это просто переменные-члены? Что делать, если правила вывода 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) лямбда — это просто 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 — самый быстрый способ проверить, «что же на самом деле сделал компилятор», куда надёжнее зубрёжки правил. Вопросы ждём в комментариях~

Похожие темы

Комментарии