Ir para o conteúdo

Última atualização:2026-10-12

C++ Insights: observação em tempo de compilação

Leitores costumam me perguntar: em que um range-for realmente vira depois de compilado? Os captures de uma lambda são simplesmente variáveis-membro? E se eu não decorar as regras de dedução do auto? As respostas todas estão escritas nos olhos do compilador, mas normalmente não as vemos. Hoje apresento uma ferramenta que traduz direto esse código do «ponto de vista do compilador»: C++ Insights.

1. O que é

C++ Insights é uma ferramenta open source de Andreas Fertig (GitHub); na essência é um Clang modificado: depois da análise semântica do seu código C++, ele «descompila» de volta para um C++ equivalente, mas totalmente explícito. Não otimiza nem gera assembly — existe só para responder «o que o compilador escreveu por mim».

2. O que dá para ver

Vamos a alguns dos cenários mais perguntados; recomendo abrir o site e colar o código abaixo para comparar.

(1) a verdadeira cara do range-for:

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

O Insights vai dizer que na verdade ele é:

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

Isso também explica por que o comportamento do loop fica indefinido quando __range fica pendurado.

(2) uma lambda é simplesmente o operator() de uma classe anônima:

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

Depois da expansão dá para ver o tipo de closure gerado pelo compilador e os membros capturados; a diferença entre mutable, captura por referência e captura por valor fica clara num piscar de olhos.

(3) auto/decltype, structured bindings, os tipos reais depois da instanciação de templates — tudo fica explícito.

3. Como usar

Versão online: cppinsights.io, cole o código à esquerda e veja o resultado à direita, com escolha do padrão C++ (11/14/17/20/23).

A versão de linha de comando pode ser instalada localmente:

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

O binário insights gerado pela compilação funciona direto com arquivos: insights hello.cpp -- -std=c++20.

4. Resumo

Ao escrever artigos, preparar palestras ou estudar para entrevistas, o Insights é o caminho mais rápido para verificar «o que o compilador realmente fez» — muito mais confiável que decorar regras. Dúvidas? Deixe nos comentários~

Tópicos relacionados

Comentários