Padrão C++20 aprovado

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.

O principal características C ++ 20 (exemplos de código):

  • 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.
  • Capacidade de capturar lambda expressões "*this".

    estrutura int_value {
    interno n = 0;
    getter_fn automático() {
    //RUIM:
    //retorna [=]() {retorna n; };

    // BOM:
    retornar [=, *isto]() { retornar n; };
    }
    };

  • Chamar elementos por ponteiro (Pointer-to-member), utilizando ponteiros para objetos temporários definidos através da expressão “const &”.
  • O operador delete com um destruidor descrito no documento P0722R1.
  • As classes podem usar parâmetros de modelo sem um tipo.

    estrutura foo {
    foo() = padrão;
    constexpr foo(int) {}
    };

    modelo
    automático get_foo() {
    retornar f;
    }

    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.

Fonte: opennet.ru

Adicionar um comentário