- 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
zzz
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
Mas ninguém demonstrou interesse
O material relacionado está aqui
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
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 quepre(num >= 0)Mas parece que priorizaram a concisão
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 behaviorSe você realmente não quiser inicializar, precisa escrever explicitamente algo como
int x = void;É algo que quase ninguém escreveria por engano
[[indeterminate]]faz voltar para UB (Undefined Behavior)Alguns projetos ainda vão preferir inicialização manual
[[indeterminate]]no código no futuroNo 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á
enquanto a página do GCC mostra “yes” para os dois
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
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 addafasta a nova geraçãoSe 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
Quase não têm chance de se tornar algo dominante
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”?
Ao planejar uma viagem, muitas vezes parece mais natural ler do maior para o menor
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
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.
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
Quanto ao empacotamento, há algo saindo do lado do CMake também.. https://www.kitware.com/common-package-specification-is-out-the-gate/
contractera mesmo o recurso que eu estava esperando, finalmente