Comitê ISO de Padronização da Linguagem C++ aprovado padrão internacional "C ++ 20". As capacidades apresentadas na especificação, com exceção de casos isolados, são suportados em compiladores GCC, Clam и Microsoft Visual C ++. Bibliotecas padrão que suportam C++20 são implementadas dentro do projeto Boost .
Nos próximos dois meses, o caderno de encargos aprovado estará na fase de preparação do documento para publicação, onde serão realizados trabalhos de correção editorial de erros ortográficos e de digitação. No início de novembro, o documento resultante será enviado à ISO para publicação sob o nome formal ISO/IEC 14882:2020. Entretanto, o comité já começou a trabalhar no próximo padrão C++23 (C++2b) e irá considerar possíveis opções na sua próxima reunião virtual. inovações.
Adicionados "conceitos", extensões de modelo, que permitem definir um conjunto de requisitos de parâmetros de modelo que, em tempo de compilação, limitam o conjunto de argumentos que podem ser aceitos como parâmetros de modelo. Os conceitos podem ser usados para evitar inconsistências lógicas entre as propriedades dos tipos de dados usados no modelo e as propriedades dos tipos de dados dos parâmetros de entrada.
modelo
conceito IgualdadeComparável = requer (T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
};
Aceitaram extensões para trabalhar com módulos que podem ser usados em vez de arquivos de cabeçalho. Os módulos fornecem uma nova maneira de organizar o código-fonte com base na definição dos limites dos componentes, sem incluir arquivos de cabeçalho via “#include”.
Macro __VA_OPT__ para expansão adaptativa de macros variáveis dependendo da presença de tokens no argumento variável.
Suporte para o operador "" para comparação de três vias.
Suporte para inicializadores de elementos padrão para bitfields.
get_foo(); // usa construtor implícito
get_foo ();
Expressões lambda não persistentes com construtor.
Permitindo sintaxe de modelo para expressões lambda (“auto f = [] (std::vetor v)").
Capacidade de usar literais de string em parâmetros de modelo.
Suporte para sintaxe de inicialização estilo C - os campos não listados explicitamente na lista de inicialização são inicializados por padrão.
estrutura A {
int x;
interno;
intz = 123;
};
Uma a {.x = 1, .z = 2}; // machado == 1, ay == 0, az == 2
Suporte para membros vazios da estrutura de dados.
Suporte para atributos prováveis e improváveis para informar o otimizador sobre a probabilidade de a construção condicional ser acionada (“[[provável]] if (random > 0) {“).
Capacidade de usar intervalos para inicializar valores de variáveis em um loop “for”
for (auto v = std::vector{1, 2, 3}; auto& e : v) {
Cálculo automático do tamanho do array em new (“new double[]{1,2,3}”);
O atributo “[[no_unique_address]]” no qual variáveis sem dados não ocupam espaço.
Ponteiros atômicos (std::atomic > e std::atomic >).
Capacidade de chamar funções virtuais em expressões condicionais.
Suporte para funções imediatas que só podem funcionar com constantes.
consteval int sqr(int n) {
retornar n*n;
}
constexpr int r = sqr(100); // OK
intx = 100;
int r2 = sqr(x); // ERRO: 'x' não pode ser usado como constante
Possibilidade de usar constexpr com funções virtuais (“constexpr virtual int f() const { return 2; }”).
Na biblioteca padrão:
Adicionado suporte para o tipo char8_t para strings UTF-8.
Adicionados bits de arquivos de cabeçalho (operações de bits) e versão.
Agora é possível verificar o prefixo e o sufixo das strings (inicia_com, termina_com).
Adicionadas características std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible e std::type_identity.
Adicionadas funções std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated e std::assume_aligned.
Adicionado suporte para arrays para std::make_shared.
Adicionada função std::to_array para converter objetos semelhantes a array em std::array.
Sintaxe de enumeração mais conveniente:
classe enum rgba_color_channel {vermelho, verde, azul, alfa};
std::string_view to_string(rgba_color_channel meu_canal) {
mudar (meu_canal) {
usando enum rgba_color_channel;
caso vermelho: retorne "vermelho";
caso verde: retorne "verde";
caso azul: retorne "azul";
caso alfa: retorne "alfa";
}
}
Nos índices, devido ao comportamento indefinido, é proibido o uso da operação “,” (“a[b,c]”). O suporte para a maioria das operações com variáveis declaradas com a palavra-chave volátil foi descontinuado, incluindo as operações “++” e “—” com tipos padrão.
Reduziu o número de situações em que "typename" é necessário para indicar a presença de um tipo.