Recurso congelar C ++ 20. Corotinas, módulos e mais

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.

Source: https://habr.com/ru/post/pt438864/


All Articles