C ++ 20 - C++20

C ++ 20 é uma versão do padrão ISO / IEC 14882 para a linguagem de programação C ++ . C ++ 20 substituiu a versão anterior do padrão C ++, chamada C ++ 17 . A norma foi finalizada tecnicamente pelo WG21 na reunião em Praga em fevereiro de 2020, aprovada em 4 de setembro de 2020 e publicada em dezembro de 2020.

Recursos

C ++ 20 adiciona mais novos recursos principais do que C ++ 14 ou C ++ 17 . As alterações aceitas no C ++ 20 incluem:

Língua

  • conceitos , com sintaxe concisa
  • módulos
  • inicializadores designados (com base no recurso C99 e extensão g ++ comum )
  • [=, this] como uma captura lambda
  • listas de parâmetros de modelos em lambdas
  • comparação de três vias usando o "operador de nave espacial",operator <=>
  • inicialização de uma variável adicional dentro de uma forinstrução baseada em intervalo
  • lambdas em contextos não avaliados
  • lambdas sem estado padrão construtíveis e atribuíveis
  • permitir expansões de pacote em lambda init-capture
  • literais de string como parâmetros de modelo
  • removendo a necessidade de typenameem certas circunstâncias
  • novos atributos padrão [[no_unique_address]], [[likely]]e[[unlikely]]
  • condicional explicit, permitindo que o modificador explícito seja contingente a uma expressão booleana
  • expandido constexpr: funções virtuais, união, tentativa e captura, dynamic_cast e typeid, std :: pointer_traits
  • funções imediatas usando a nova constevalpalavra-chave
  • inteiros com sinal agora são definidos para serem representados usando o complemento de dois (estouro de inteiro com sinal permanece comportamento indefinido )
  • um modelo de memória revisado
  • várias melhorias para ligações estruturadas (interação com capturas lambda, duração de armazenamento estático e thread_local)
  • co-rotinas
  • using em enums com escopo
  • constinit palavra-chave

Biblioteca

  • intervalos (a proposta de um intervalo)
  • std::make_sharede std::allocate_sharedpara matrizes
  • ponteiros inteligentes atômicos (como std::atomic<shared_ptr<T>>e std::atomic<weak_ptr<T>>)
  • std::to_address para converter um ponteiro em um ponteiro bruto
  • adições de calendário e fuso horário para <chrono>
  • std::span, fornecendo uma visualização para uma matriz contígua (análogo a, std::string_viewmas spanpode alterar a sequência referenciada)
  • std::erasee std::erase_if, simplificando o apagamento de elemento para a maioria dos contêineres padrão
  • <version> cabeçalho
  • std::bit_cast<>para conversão de tipos de representações de objetos, com menos verbosidade memcpy()e mais capacidade de explorar componentes internos do compilador
  • macros de teste de recursos
  • vários bits da biblioteca constexpr
  • criação de ponteiro inteligente com inicialização padrão
  • std::map::contains método
  • operações de bit, como contagem inicial / final de zero / um e operações log2
  • std::bind_front

Palavras-chave novas e alteradas

Muitas novas palavras-chave adicionadas (e o novo "operador nave espacial", operator <=>), tais como concept, constinit, consteval, co_await, co_return, co_yield, requires(mais significado alterado para export), e char8_t(para UTF-8 suporte). E explicitpode receber uma expressão desde C ++ 20. A maioria dos usos da volatilepalavra - chave foi descontinuada.

Além das palavras-chave, existem identificadores com significado especial , incluindo novos importe module.

Novos atributos em C ++ 20: [[likely]], [[unlikely]], e[[no_unique_address]]

Publicado como Especificações Técnicas

  • Paralelismo TS v2 (incluindo blocos de tarefas)
  • Rede TS v1
  • Reflexão TS v1

Adiado para um padrão posterior

  • Contratos - um novo grupo de estudo (SG21) foi formado para trabalhar em uma nova proposta
  • Reflexão
  • Metaclasses
  • Executores
  • Extensões de rede, incluindo assíncrono, serviços básicos de E / S, temporizadores, buffers e streams orientados a buffer, soquetes e protocolos de Internet (bloqueados por executores)
  • Propriedades
  • Futuros estendidos

Recursos removidos e suspensão de uso

C ++ 20 também removeu alguns recursos.

  • Os C cabeçalhos derivada de <ccomplex>, <ciso646>, <cstdalign>, <cstdbool>e <ctgmath>foram removidos, uma vez que não servem em C ++. (Os <*.h>cabeçalhos correspondentes permanecem, para compatibilidade com C.)
  • O uso de throw()como uma especificação de exceção foi removido.
  • Alguns recursos de biblioteca previamente obsoletas foram removidas, incluindo std::uncaught_exception, std::raw_storage_iterator, std::is_literal_type, std::is_literal_type_v, std::result_ofe std::result_of_t.

Os recursos obsoletos incluem:

  • O uso do operador vírgula em expressões subscritas foi descontinuado
  • (a maioria de) volatilefoi descontinuado

Suporte a compilador

  • O Clang tem suporte parcial a C ++ 20 que pode ser ativado com a opção -std=c++20(versão 10 e posterior) ou -std=c++2a(versão 9 e anterior).
  • A EDG eccp começou a implementar os recursos do C ++ 20 na versão 5.0 e, a partir da versão 6.1, oferece suporte à maioria dos recursos da linguagem principal do C ++ 20.
  • O GCC adicionou suporte parcial e experimental a C ++ 20 em 2017 na versão 8 por meio da opção -std=c++2a. Como o Clang, o GCC substituiu esta opção -std=c++20na versão 10. Ele também tem uma opção para habilitar extensões GNU além do suporte experimental C ++ 20 -std=gnu++20,.
  • O Microsoft Visual Studio oferece suporte a todos os recursos do C ++ 20 por meio de sua /std:c++latestopção, a partir da versão 16.10.0. Uma opção /std:c++20para ativar o modo C ++ 20 foi adicionada na versão 16.11.0.

História

As alterações aplicadas ao rascunho de trabalho C ++ 20 em julho de 2017 (Toronto) incluem:

  • conceitos (o que o tornou padrão é uma versão reduzida, também descrita como "Conceitos Lite")
  • inicializadores designados
  • [=, this] como uma captura lambda
  • listas de parâmetros de modelos em lambdas
  • std::make_sharede std::allocate_sharedpara matrizes

As alterações aplicadas ao projeto de trabalho C ++ 20 na reunião de outono em novembro de 2017 (Albuquerque) incluem:

  • comparação de três vias usando o "operador de nave espacial",operator <=>
  • inicialização de uma variável adicional dentro de uma forinstrução baseada em intervalo
  • lambdas em contextos não avaliados
  • lambdas sem estado padrão construtíveis e atribuíveis
  • permitir expansões de pacote em lambda init-capture
  • literais de string como parâmetros de modelo
  • ponteiros inteligentes atômicos (como std::atomic<shared_ptr<T>>e std::atomic<weak_ptr<T>>)
  • std::to_address para converter um ponteiro em um ponteiro bruto

As alterações aplicadas ao rascunho de trabalho do C ++ 20 em março de 2018 (Jacksonville) incluem:

  • removendo a necessidade de typenameem certas circunstâncias
  • novos atributos padrão [[no_unique_address]], [[likely]]e[[unlikely]]
  • adições de calendário e fuso horário para <chrono>
  • std::span, fornecendo uma visualização para uma matriz contígua (análogo a, std::string_viewmas spanpode alterar a sequência referenciada)
  • <version> cabeçalho

As alterações aplicadas ao rascunho de trabalho do C ++ 20 na reunião de verão em junho de 2018 (Rapperswil) incluem:

  • contratos ( posteriormente diferidos para um padrão posterior )
  • macros de teste de recursos
  • conversão de bits de representações de objetos, com menos verbosidade memcpy()e mais capacidade de explorar componentes internos do compilador
  • condicional explicit, permitindo que o modificador explícito seja contingente a uma expressão booleana
  • funções virtuais constexpr

As alterações aplicadas ao rascunho de trabalho do C ++ 20 na reunião de outono em novembro de 2018 (San Diego) incluem:

  • intervalos (a proposta de um intervalo)
  • conceito de sintaxe concisa
  • união constexpr, try and catch, dynamic_cast, typeid e std :: pointer_traits.
  • vários bits da biblioteca constexpr
  • funções imediatas usando a nova constevalpalavra-chave
  • inteiros com sinal agora são definidos para serem representados usando o complemento de dois (estouro de inteiro com sinal permanece comportamento indefinido )
  • refinamentos da facilidade de contratos (controle de acesso nas condições do contrato) (ver lista de recursos adiados para um padrão posterior )
  • um modelo de memória revisado
  • criação de ponteiro inteligente com inicialização padrão

As alterações aplicadas ao rascunho de trabalho do C ++ 20 na reunião de inverno em fevereiro de 2019 (Kona) incluem:

  • co-rotinas
  • módulos
  • várias melhorias para ligações estruturadas (interação com capturas lambda, duração de armazenamento estático e thread_local)

As alterações aplicadas ao rascunho de trabalho do C ++ 20 na reunião de verão em julho de 2019 (Colônia) incluem:

  • contratos foram removidos (ver lista de recursos adiados para um padrão posterior )
  • o uso do operador vírgula em expressões subscritas foi descontinuado
  • adições constexpr (inicialização padrão trivial, montagem embutida não avaliada)
  • usando enums com escopo
  • várias mudanças no operador da nave
  • DR: pequenas alterações nos módulos
  • constinit palavra-chave
  • mudanças de conceitos (remoção de -> Typerequisitos de tipo de retorno)
  • (a maioria de) volatilefoi descontinuado
  • DR: [[nodiscard]]efeitos nos construtores
  • Os novos conceitos de biblioteca padrão não usarão PascalCase (ao invés de standard_case, como o resto da biblioteca padrão)
  • formatação de texto (integração cronológica, correções de esquinas)
  • operações de bit
  • constexpr INVOKE
  • constantes matemáticas
  • adições de consistência para atômicas ( std::atomic_ref<T>, std::atomic<std::shared_ptr<T>>)
  • adicione o <=>operador à biblioteca padrão
  • unidades de cabeçalho para a biblioteca padrão
  • recursos de sincronização (combinados de: espera atômica eficiente e semáforos, travas e barreiras, aprimoramento de atomic_flag, não torne o C ++ não implementável em CPUs pequenas)
  • std::source_location
  • contêineres constexpr ( std::string, std::vector)
  • std::stop_tokene juntando-se ao tópico ( std::jthread)

As alterações aplicadas durante a resolução de comentário do NB na reunião de outono de novembro de 2019 (Belfast) incluem:

  • Tipos de classe em parâmetros de modelo sem tipo (NTTP): A restrição de nenhuma operator==permissão definida pelo usuário foi removida, pois o significado da igualdade de argumento do modelo foi divorciado operator==. Isso também permite membros da matriz em NTTP do tipo de classe.
  • Tipos de ponto flutuante, ponteiros e referências e uniões e classes semelhantes a união (tipos de classe contendo uniões anônimas) agora são permitidos como NTTP.
  • A identidade da função agora também inclui cláusulas requeridas à direita (P1971)
  • Funções não-modelo restritas foram removidas
  • <compare> agora está disponível em implementações independentes
  • std::spans typedef foi alterado de index_typepara size_typepara ser consistente com o resto da biblioteca padrão
  • Traços de conceito foram renomeados para seguir a renomeação dos conceitos como resultado do encontro de Colônia
  • Várias correções e acréscimos aos intervalos (P1456R1: visualizações apenas de movimento, P1391R4: construtor de intervalo para std::string_view(construtor do par de caracteres iterador), P1394R4: Construtor de intervalo para std::span<ref>, P1870R1: intervalo de encaminhamento <T> é muito sutil)
  • A inicialização de std::atomic<T>foi alterada para funcionar com a inicialização padrão e de lista, std::latche std::barrieragora pode relatar o número máximo de threads que a implementação suporta por meio da nova função de membromax()
  • std::weak_equalitye std::strong_equalityforam removidos porque não são mais usados
  • Algoritmos <numeric>foram feitosconstexpr
  • Macros de teste de recursos ausentes para recursos novos ou alterados do C ++ 20 foram adicionados

Referências

links externos