C ++ 20 - C++20
Revisões de linguagem C ++ |
---|
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
for
instruçã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
typename
em 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
consteval
palavra-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_shared
estd::allocate_shared
para matrizes - ponteiros inteligentes atômicos (como
std::atomic<shared_ptr<T>>
estd::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_view
masspan
pode alterar a sequência referenciada) -
std::erase
estd::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 verbosidadememcpy()
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 explicit
pode receber uma expressão desde C ++ 20. A maioria dos usos da volatile
palavra - chave foi descontinuada.
Além das palavras-chave, existem identificadores com significado especial , incluindo novos import
e 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_of
estd::result_of_t
.
Os recursos obsoletos incluem:
- O uso do operador vírgula em expressões subscritas foi descontinuado
- (a maioria de)
volatile
foi 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++20
na 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++latest
opção, a partir da versão 16.10.0. Uma opção/std:c++20
para 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_shared
estd::allocate_shared
para 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
for
instruçã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>>
estd::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
typename
em 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_view
masspan
pode 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
consteval
palavra-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
-> Type
requisitos de tipo de retorno) - (a maioria de)
volatile
foi 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_token
e 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 divorciadooperator==
. 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::span
s typedef foi alterado deindex_type
parasize_type
para 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 parastd::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::latch
estd::barrier
agora pode relatar o número máximo de threads que a implementação suporta por meio da nova função de membromax()
-
std::weak_equality
estd::strong_equality
foram 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
- Link para adquirir a ISO / IEC 14882: 2020 na loja online da ISO.
- N4860 , a versão final do rascunho do padrão.
- JTC1 / SC22 / WG21 - o Grupo de Trabalho do Padrão ISO / IEC C ++ (também conhecido como Comitê de Padrões C ++)
- Repositório GitHub de intervalos ( range-v3 ), de Eric Niebler