No outro dia, houve uma reunião do comitê internacional de padronização C ++ na cidade americana de Kona. Não foi apenas uma reunião, mas um congelamento de recursos! Nenhuma idéia nova e séria pode se infiltrar no padrão, existem apenas algumas reuniões para adicionar itens pré-aprovados, corrigir deficiências e eliminar asperezas.
Caso Módulos e Corutins sejam esperados no C ++ 20, haverá uma biblioteca rápida para formatar a saída, será capaz de trabalhar com calendários, eles adicionarão
std :: stacktrace , o compilador começará a chamar
std :: move-se em alguns casos, eles aceitarão o
std :: flat_map ? Tudo isso e muito mais espera por você sob o corte.

Coroutines TS
O debate mais quente eclodiu em torno das corotinas. O comitê teve que considerar três abordagens diferentes para as corotinas e decidir se aceitaria o TS de Coroutines existente como padrão ou seguiria um caminho diferente.
A escolha não foi fácil, cada abordagem tem suas desvantagens e vantagens:
- N4775 :
- + não há restrições quanto ao fato de que as rotinas devem ser descritas no arquivo de cabeçalho
- - não há garantias estritas de que não haverá alocação dinâmica
- ± não é a interface mais fácil ( P1477R0 corrige isso)
- - palavras-chave feias co_await e co_yield (a sentença P1485R0 do WP21 corrige isso)
- + 3 anos aplicados na prática
- P1063R2 :
- + sem alocações dinâmicas
- - as rotinas devem ser descritas no arquivo de cabeçalho ou você precisa se enganar com o tipo de exclusão
- - operadores de chave ainda mais assustadores [<-] e [->]
- - nenhum protótipo de trabalho
- - não é a interface mais fácil para criar coisas assíncronas
- P1430R0 :
- + sem alocações dinâmicas
- - as rotinas devem ser descritas no arquivo de cabeçalho ou você precisa sair maliciosamente com o tipo de apagamento
- + sem palavras-chave assustadoras, tudo é tranquilo
- + Os usuários de Corutin não veem o interior assustador da rotina (nem sequer veem os análogos co_await, tudo funciona imediatamente)
- - a primeira proposta, nunca foi discutida, requer várias melhorias
- - é impossível implementar as tecnologias atuais (requer suporte para estruturas de tamanho dinâmico), exige enormes custos de mão-de-obra para implementar
- ± um pouco como macarrão de retorno de chamada
Após muito debate, as corotinas foram adotadas no C ++ 20 como no Coroutines TS (com prefixos
co_ * e pontos de personalização antigos).
Módulos
A discussão dos módulos foi influenciada por um documento interessante com medições de desempenho:
P1441R0 . Os resultados podem ser interpretados de diferentes maneiras: de "os sistemas de montagem existentes e a implementação de módulos ainda não estão otimizados o suficiente" para "os módulos não escalam bem com a crescente complexidade do projeto".
Além deste documento, o comitê discutiu uma série de pequenas alterações nos módulos atuais. Como resultado, após 15 anos de discussão, prototipagem e experimentação de implementações, os módulos foram adotados em C ++ 20.
Formatar
Boas notícias a todos! Se você não encontrar falhas fatais no subgrupo Biblioteca, no C ++ 20 será possível formatar seqüências de caracteres com segurança e muito rapidamente. Diga adeus aos
std :: ios ,
std :: locale e aos outros horrores dos anos 90! Agora, o Python possui uma sintaxe semelhante para formatação
imediata em C ++:
P0645R5 .
Além disso, a proposta de integrar os novos horários de formatação e calendário
P1361R0 foi aceita . Se tudo correr conforme o planejado, as datas poderão ser exibidas de maneira humana!
Rede, Executores e Propriedades
Os executores são um componente importante para oferecer suporte à rede em C ++ imediatamente. Os executores precisam de Propriedades - a capacidade de modificar o tipo de dados, dependendo do parâmetro passado no estágio de compilação, sem alterar o conceito do tipo.
As propriedades são descritas em
P1393R0 . Apesar de o texto para inclusão no padrão ser apenas algumas páginas, a proposta causou discussões acaloradas. A proposta permite que você faça pontos de personalização quase onipotentes, altere o comportamento de qualquer função usando Propriedades.
Como resultado, decidiu-se incluir Propriedades no idioma apenas no C ++ 23 e, portanto, Executors and Networking in C ++ 20 não aparecerão.
Outros
As seguintes alterações já foram feitas no rascunho do C ++ 20:
- Estruturas sem construtores (agregados) agora podem ser inicializadas usando parênteses P0960 . Na prática, isso significa que agora std :: make_shared , std :: make_unique , std :: * :: emplace * funcionará corretamente com agregados sem erros de compilação
- Funções de Lerp para interpolação linear P0811 foram adicionadas
- Adicionada a capacidade de vetorizar os algoritmos da biblioteca padrão P1001
- Os métodos std :: span agora retornam tipos não assinados (semelhante a toda a biblioteca padrão) + a função std :: ssize foi adicionada para obter o tamanho do contêiner como um número assinado P1227
- Contêineres não ordenados aprenderam como procurar valores usando um hash pré-calculado de P0920
Muitas outras coisas aguardam a revisão final nos subgrupos Biblioteca e Núcleo para inclusão no C ++ 20:
- Espera efetiva em std :: atomic; classes de semáforo e barreira P1135
- std :: flat_map P0429
- std :: flat_set P1222
- std :: function_ref P0792
- constexpr para <cmath> e <cstdlib> P0533
- std :: ranges :: to <any-container> para armazenar um intervalo de valores em um contêiner P1206
- A capacidade de extrair eficientemente cadeias de caracteres de std :: * stringstream e transferir cadeias personalizadas P0408
- Várias edições para o operador <=> , intervalos, constexpr
Méritos do RG21
No primeiro dia, o subgrupo Core aceitou a proposta amada
Yandex.Taxi para o Stacktrace
P0881R3 . Os comentários sobre o design foram discutidos no subgrupo LEWG, mais uma vez elaborado no Core. Como resultado, correções foram feitas ao longo da semana e discussões foram realizadas. A proposta ainda não está incluída no rascunho da norma, mas deve estar no C ++ 20 (se de repente encontrarem alguma falha fatal).
Antes de discutir nossa idéia de
P1485R0 para trazer palavras-chave para a corotina, ela não chegou a uma conclusão.
Também no SG1, a Concurrency discutiu a ideia de um mapa não ordenado simultâneo
P0652R2 . Nos pediram para verificar se a API proposta evita a contenção do leitor. Eles também disseram investigar contêineres não ordenados simultâneos que não têm a função de apagar e não protegem o valor do contêiner contra modificações competitivas.
A oferta do
ZaMaZaN4iK para especializar std :: hash para várias classes da biblioteca padrão
P1406R0 foi decididamente cortada. O comitê recomendou deixar especializações apenas para
std :: pair ,
std :: tuple ,
std :: array e
std :: basic_string dos alocadores de usuários.
Em um subconjunto de números, o SG6 discutiu um mecanismo para a interação de várias novas classes de números
P0880R2 . A proposta permite que você especialize dois modelos, obtenha um conjunto completo de operações matemáticas e comparações para todos os novos tipos. Após a discussão, eles decidiram tentar expandir o mecanismo para que pudesse ser usado não apenas para as necessidades da biblioteca padrão, mas também para que os usuários pudessem usar esses operadores para seus tipos.
Também discutimos nossas sugestões secundárias, incluindo a macro de teste de recursos
P1424R0 e políticas para adicioná-las ao padrão.
Discutimos rapidamente nossa idéia de permitir que o compilador remova cópias desnecessárias do
R0889R1 . Disseram-nos para continuar trabalhando nessa direção e lançamos exemplos que não deveriam violar as novas regras.
Em vez de totais
O C ++ 20 será tão dramaticamente diferente do C ++ 17 quanto o C ++ 11 será diferente do C ++ 03. Um grande número de novas tecnologias e novos paradigmas: Conceitos, Contratos, Intervalos, Módulos, Corotinas, contêineres constexpr e polimorfismo dinâmico constexpr, "niblóides", etc.
Em breve
, o Grupo de Trabalho 21 publicará comentários sobre um rascunho do padrão C ++ 20. Portanto, se você sentir alguma dor ou não concordar com nenhuma inovação, deixe sua opinião
nesta página .
A próxima reunião do comitê internacional será no verão, na qual as inovações para o C ++ 23 poderão começar a ser consideradas. Se você deseja alterar algo em C ++ ou propor sua ideia, sempre pode escrever em
https://stdcpp.ru/ , onde as pessoas do WP21 o ajudarão a transmitir seus desejos ao comitê.
Gostaria de falar conosco ao vivo? Uma reunião aberta do RG21 será realizada em breve.
Fique atento aos anúncios em events.yandex.ru . Também procure-nos na conferência
Rússia C ++ de abril em Moscou.