22 pontos por GN⁺ 2026-03-31 | 6 comentários | Compartilhar no WhatsApp
  • O C++26 foi oficialmente concluído. Ele inclui quatro recursos centrais: reflection, reforço da segurança de memória, contracts e std::execution
  • A reflection em tempo de compilação é descrita como o mecanismo de abstração mais poderoso da história do C++ desde a introdução dos templates, permitindo que a linguagem descreva a si mesma e gere código
  • Apenas recompilar código C++ existente com C++26 já elimina o comportamento indefinido (UB) de variáveis locais não inicializadas, e a biblioteca padrão reforçada garante segurança de bounds
  • Segundo os resultados de implantação no Google, foram corrigidos mais de 1.000 bugs e houve uma redução medida de 30% em segfaults em produção
  • Espera-se adoção rápida pelos compiladores, com o GCC já tendo integrado reflection e contracts ao trunk

C++26 concluído: o lançamento mais importante desde o C++11

  • Na reunião do comitê ISO C++ realizada em Croydon, Londres, Reino Unido, o trabalho técnico do C++26 foi finalmente concluído
    • Cerca de 210 participantes (130 presenciais, 80 remotos via Zoom), com representantes oficiais de 24 países
    • A maior parte da reunião foi dedicada ao tratamento de 411 comentários internacionais (fase CD) recebidos no verão
    • O foco foi no acabamento final (fit-and-finish), sem adicionar nem remover novos recursos
  • O C++26 finalizado nesta reunião entrou na etapa de preparação do documento final para a votação de aprovação internacional (DIS)

Os 4 recursos centrais do C++26

(1) Reflection

  • Considerado o maior upgrade da história do desenvolvimento em C++ desde a invenção dos templates, permitindo que a linguagem descreva a si mesma e gere código
  • Em junho de 2025, o comitê de C++ incluiu a reflection em tempo de compilação no rascunho do C++26, marcando um ponto de virada na história da linguagem
  • Foi apresentada como “o novo mecanismo mais poderoso para expressar abstrações eficientes, e serão necessários os próximos 10 anos para descobrir do que esse foguete é capaz”

(2) Reforço da segurança de memória

  • Apenas recompilando, uma categoria inteira de UB em código C++ existente — leitura de variáveis locais não inicializadas — é eliminada no C++26
  • A Hardened Standard Library foi padronizada, garantindo segurança de bounds em tipos importantes como vector, span, string e string_view
    • O overhead de desempenho medido foi, em média, de 0,3% (menos de 1%)
    • Já foi implantada em centenas de milhões de linhas de código em plataformas da Apple e em serviços do Google
  • Resultados da implantação no Google:
    • Mais de 1.000 bugs corrigidos
    • Previsão de prevenir 1.000 a 2.000 bugs por ano
    • Redução de 30% na taxa de segfaults em produção como um todo
    • Em toda a base de código C++ do Google, apenas 5 serviços fizeram opt-out total, e APIs de acesso inseguro são usadas em apenas 7 pontos

(3) Contracts: pre, post, contract_assert

  • O C++26 introduz contracts em nível de linguagem — suporte a precondições, pós-condições e instruções de assertion em declarações de função
  • O recurso é avaliado como muito mais poderoso do que a macro assert da linguagem C
  • Resultado das votações para adoção de contracts:
    • Fevereiro de 2025 (merge no working draft): 100 a favor, 14 contra, 12 abstenções
    • Março de 2026 (aprovação final no C++26): 114 a favor, 12 contra, 3 abstenções
  • Algumas preocupações técnicas de especialistas do comitê continuaram, mas foram amplamente discutidas ao longo de três reuniões e várias teleconferências
  • Antes da reunião de novembro de 2025, foram corrigidos 2 bugs na especificação de contracts com base no feedback recebido

(4) std::execution (Sender/Receiver)

  • É o modelo assíncrono do C++, um framework unificado para expressar e controlar concorrência e paralelismo
  • Possui características de segurança que facilitam escrever structured concurrency (concorrência com ciclos de vida estritamente aninhados), prevenindo estruturalmente data races
  • Atenção: no momento, a documentação ainda é insuficiente e faltam bibliotecas “fingers-and-toes”, o que torna a adoção mais difícil do que em outros recursos do C++
    • Pode ser necessário o apoio de especialistas que já dominem o modelo e a criação de bibliotecas adaptadoras para integração com código assíncrono existente

Por que o C++26 deve ser adotado rapidamente

  • Trata-se do conjunto de recursos mais demandado desde o C++11, incluindo reflection e reforços de segurança que a maioria dos desenvolvedores C++ usará no dia a dia
    • Há a avaliação de que Parallel STL, concepts, coroutines e modules do C++17, C++20 e C++23 não tiveram impacto tão amplo quanto o C++11 para todos os desenvolvedores C++
  • GCC e Clang mantiveram, ao longo do desenvolvimento do C++26, cerca de dois terços dos recursos já implementados previamente
    • O GCC já integrou reflection e contracts ao trunk, aguardando lançamento

Início dos trabalhos no C++29: aprofundando a segurança de memória

  • Nesta reunião, também foi adotado o cronograma do C++29, mantendo o ciclo de lançamentos a cada 3 anos
  • O principal foco do C++29 foi definido como reforço adicional da segurança de tipos e de memória
    • Estão em análise propostas para reduzir ainda mais o comportamento indefinido (UB)
    • O SG23 (subgrupo de segurança e proteção) está trabalhando com base no perfil de segurança de tipos P3984 de Bjarne Stroustrup e no framework geral de perfis de Gabriel Dos Reis
  • Oliver Hunt, da Apple, apresentou o P4158R0 “C++ subsetting and restrictions for memory safety”
    • A abordagem subset-of-superset foi aplicada a mais de 4 milhões de linhas de código do WebKit
    • Foi relatado que ela “bloqueia várias classes de vulnerabilidades, e a política atual teria prevenido a maioria dos exploits do passado”
  • O tema segurança de memória foi discutido em profundidade na sessão de quarta-feira à noite com participação da maioria do comitê e também em uma sessão exclusiva do EWG na tarde de sexta-feira com cerca de 90 participantes
  • A biblioteca de quantities and units (P3045R7 “Quantities and units library”) avançou do SG6 e SG18 para o LEWG (subgrupo principal de evolução da biblioteca)

Próximos passos

  • As próximas duas reuniões estão previstas para Brno, na República Tcheca (junho), e Búzios, Rio de Janeiro, Brasil (novembro)
  • Nessas duas reuniões, começarão os trabalhos de adição de recursos ao working draft do C++29
  • Entre agora e a próxima reunião, já estão programadas diversas teleconferências dos subgrupos

6 comentários

 
roxie 28 일 전

zzz

 
GN⁺ 2026-03-31
Comentários do Hacker News
  • É uma pena que o recurso de Contracts tenha sido adotado no padrão do C++
    Dá a sensação de adicionar ainda mais complexidade a uma linguagem que já atingiu o limite nesse aspecto
    O próprio Bjarne Stroustrup descreveu esse recurso como um “design incompleto e inflado pelo estilo de comitê”
    Também acho que ele tem muitos riscos inerentes (footguns), então sua justificativa parece fraca

    • No começo dos anos 90, implementei pessoalmente uma extensão de Contracts para C++
      Mas ninguém demonstrou interesse
      O material relacionado está aqui
    • É interessante que muita gente diga “C++ é complexo demais”, mas cada um pensa em um recurso complexo diferente
    • O design de Contracts em C++ pode estar errado, mas acho que o conceito em si é essencial para a evolução da linguagem
      Como em Ada ou Rust, é um elemento central para integração com verificação formal (proof assistant), permitindo validação estática no lugar de testes
      Vale olhar o Ada Spark
    • A documentação sobre Contracts é muito confusa
      O primeiro exemplo na documentação do cppreference é justamente um caso excepcional que altera estado
      A sintaxe também não é intuitiva
      Por exemplo, algo como asserts_pre(num >= 0) teria sido muito mais claro do que pre(num >= 0)
      Mas parece que priorizaram a concisão
    • Contracts apenas padronizam algo que os desenvolvedores de C++ já faziam informalmente
      Em vez de adicionar complexidade, a ideia é unificar implementações dispersas e melhorar a interoperabilidade
      Na verdade, vejo recursos como Reflection adicionando ainda mais complexidade
  • Como desenvolvedor de C# e Java, tenho uma curiosidade
    Gostaria de saber que tipos de aplicações estão sendo feitos em C++ hoje em dia
    Não costumo ter muitas oportunidades de ouvir que problemas ele resolve na prática

  • A redefinição de “erroneous behavior” para variáveis não inicializadas é interessante
    Segundo o documento do padrão, isso gera custo em tempo de execução,
    e o atributo [[indeterminate]] pode ser usado para voltar ao undefined behavior

    int x [[indeterminate]];
    std::cin >> x;
    
    • A linguagem D inicializa automaticamente todas as variáveis
      Se você realmente não quiser inicializar, precisa escrever explicitamente algo como int x = void;
      É algo que quase ninguém escreveria por engano
    • Dei uma lida rápida no documento e duas coisas me chamaram atenção
      1. Não está claro o que exatamente significa “valor determinado de forma independente” — é preencher com zero ou usar algum valor arbitrário da memória?
      2. Fico em dúvida sobre por que [[indeterminate]] faz voltar para UB (Undefined Behavior)
    • Provavelmente esse recurso poderá ser controlado por flags do compilador
      Alguns projetos ainda vão preferir inicialização manual
    • Dá até medo pensar em quem encontrar [[indeterminate]] no código no futuro
      No fim, a pessoa vai perder tempo procurando o significado ou simplesmente ignorar isso depois
      Isso me lembra de quando achei código Rust difícil de ler por causa de genéricos e traits demais
  • Trabalhei no time de C++ da Microsoft nos anos 90
    Na época, eu achava que RTTI era o limite do sistema de reflexão que o C++ poderia ter
    É surpreendente ver até onde isso avançou

  • Fazer a reunião em Croydon e não deixar ninguém sair até assinarem foi uma estratégia bem astuta
    Eu não gostaria de trabalhar lá de novo

  • Fiquei curioso sobre o estágio de implementação do C++26 no GCC e no Clang
    O GCC já integrou reflection e contracts na trunk, mas queria saber em que ponto o Clang está

    • A página de status do Clang mostra ambos como “no”,
      enquanto a página do GCC mostra “yes” para os dois
    • A Bloomberg publicou uma implementação de reflection para Clang aqui
      Ela já pode ser usada no Compiler Explorer e está sendo aproveitada para adicionar reflection ao simdjson
  • Fico em dúvida se as mudanças no sistema de módulos deste padrão vão realmente fazer com que ele seja mais usado

    • Acho que o WG de C++ deveria ao menos uma vez focar mais em módulos e empacotamento do que em novos recursos
      Esse é justamente o motivo pelo qual o Cargo do Rust passa o C++ por cima
      Não conseguir adicionar uma dependência com uma simples linha cargo add afasta a nova geração
    • A maioria dos compiladores ainda não oferece suporte a header unit
      Se o CMake adotar o modelo de compilação em duas etapas do Clang, a velocidade de build deve melhorar bastante,
      e só então os módulos provavelmente começarão a ser adotados de verdade
    • Acho que módulos já são uma ideia fracassada
      Quase não têm chance de se tornar algo dominante
    • Sinceramente, eu gostaria que o desenvolvimento do C++ simplesmente parasse agora
      Há recursos novos demais para acompanhar
      O sistema de build é uma bagunça, e os arquivos de cabeçalho já deveriam desaparecer
  • Não tem a ver com o tema, mas a expressão “London Croydon” soa estranha
    O normal não seria “Croydon, London”?

    • Existem também casos comuns na ordem inversa, como “London Gatwick Airport”
      Ao planejar uma viagem, muitas vezes parece mais natural ler do maior para o menor
    • Cada pessoa escolhe entre começar pelo específico ou pelo geral
      Talvez tenham escrito “London, Croydon” para passar a impressão de que “a reunião foi em Londres”
      “Croydon, London” soa mais como “foi em Croydon, na periferia de Londres”, então parece menos elegante — interpretação em tom de brincadeira
  • Também há reações cínicas, do tipo “chegou bem na hora antes da linguagem ser abandonada”

  • Se o C++29 focar apenas em melhorias de qualidade e refinamento do que já existe, acho que a comunidade não reclamaria tanto

    • Pessoalmente, eu já ficaria satisfeito se o C++29 trouxesse só uma função random() de uma linha
    • Claro, a reação da comunidade vai variar conforme os recursos que forem adicionados
 
woonsa 29 일 전

Em vez de adicionar recursos para garantir a segurança de memória, só de impedir ponteiros pendentes e referências mutáveis a segurança de memória já aumentaria, mas no fim estão apenas elevando a complexidade do código com mais funcionalidades.

 
tsboard 29 일 전

Foi difícil fazer a migração para Rust, então é animador ver que muitas das funcionalidades que eu estava esperando foram incorporadas ao rascunho do padrão C++26. Mas não vou voltar para C++ de novo... haha

 
heal9179 2026-04-01

Quanto ao empacotamento, há algo saindo do lado do CMake também.. https://www.kitware.com/common-package-specification-is-out-the-gate/

 
heal9179 2026-04-01

contract era mesmo o recurso que eu estava esperando, finalmente