O Comitê ISO sobre a padronização da linguagem C++ padrão internacional ““. As funcionalidades apresentadas na especificação, com exceção de casos isolados, nos compiladores , e . As bibliotecas padrão que suportam C++20 foram implementadas no âmbito do projeto .
Nos próximos dois meses, a especificação aprovada estará em fase de preparação do documento para publicação, onde será realizada a revisão editorial para correção de erros ortográficos e de impressão. No início de novembro, a versão resultante do documento será enviada ao ISO para publicação sob o nome formal ISO/IEC 14882:2020. Enquanto isso, o comitê já iniciou os trabalhos no próximo padrão C++23 (C++2b) e, na próxima reunião virtual, examinará possíveis .
():
- Foram adicionadas ‘conceitos’, extensões de templates que permitem definir um conjunto de requisitos para os parâmetros do template, que durante a compilação limitam o conjunto de argumentos que podem ser aceitos como parâmetros do template. Os conceitos podem ser usados para evitar inconsistências lógicas entre as propriedades dos tipos de dados utilizados dentro do template e as propriedades dos tipos de dados dos parâmetros de entrada.
template
concept EqualityComparable = requires(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
}; - Faz parte do conjunto para trabalhar com módulos, que podem ser usados em vez de arquivos de cabeçalho. Os módulos fornecem uma nova forma de organizar textos fonte com base na definição de limites de componentes, sem arquivos de cabeçalho incluídos por meio de ‘#include’.
- A macro __VA_OPT__ para a expansão adaptativa de macros variáveis dependendo da presença de tokens no argumento variável.
- Suporte ao operador “” para comparação tripla.
- Suporte a inicializadores de elementos padrão para campos de bits.
- A possibilidade de captura de expressão lambda “*this”.
struct int_value {
int n = 0;
auto getter_fn() {
// BAD:
// return [=]() { return n; };// GOOD:
return [=, *this]() { return n; };
}
}; - Chamada de elementos por ponteiro (Pointer-to-member), utilizando ponteiros para objetos temporários definidos pela expressão ‘const &’.
- Operador delete com o destrutor descrito no documento .
- Classes são permitidas para usar parâmetros de template sem tipo.
struct foo {
foo() = default;
constexpr foo(int) {}
};template
auto get_foo() {
return f;
}get_foo(); // usa o construtor implícito
get_foo(); - Expressões lambda não armazenáveis com construtor.
- Permissibilidade do uso de sintaxe de template para expressões lambda (“auto f = [](std::vector v)”).
- Possibilidade de usar literais de string em parâmetros de template.
- Suporte à sintaxe de inicialização ao estilo C — membros não listados na inicialização são inicializados por padrão.
struct A {
int x;
int y;
int z = 123;
};A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2
- Suporte a membros vazios em estruturas de dados.
- Suporte aos atributos likely e unlikely para informar o otimizador sobre a probabilidade de uma estrutura condicional ser ativada (“[[likely]] if (random > 0) {”).
- Possibilidade de usar intervalos para inicializar 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}”);
- Atributo “[[no_unique_address]]” onde variáveis sem dados não ocupam espaço.
- Ponteiros atômicos (std::atomic<shared_ptr> e std::atomic<weak_ptr>).
- Possibilidade de chamar funções virtuais em expressões condicionais.
- Suporte a funções rápidas (immediate) que só podem operar com constantes.
consteval int sqr(int n) {
return n * n;
}constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // ERROR: ‘x’ não pode ser usado como constante - Possibilidade de aplicar constexpr com funções virtuais (“constexpr virtual int f() const { return 2; }”).
- Na biblioteca padrão:
- Adicionada a suporte para o tipo char8_t para strings UTF-8.
- Adicionados os arquivos de cabeçalho bit (operações bit) e version.
- Possibilidade de verificar prefixos e sufixos de strings (starts_with, ends_with).
- Adicionados os tipos std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible e std::type_identity.
- Adicionadas as funções std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated e std::assume_aligned.
- Suporte a arrays adicionado em std::make_shared.
- Adicionada a função std::to_array para converter objetos semelhantes a arrays em std::array.
- Sintaxe de enumerações mais conveniente:
enum class rgba_color_channel { red, green, blue, alpha };
std::string_view to_string(rgba_color_channel my_channel) {
switch (my_channel) {
using enum rgba_color_channel;
case red: return "red";
case green: return "green";
case blue: return "blue";
case alpha: return "alpha";
}
} - Em í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 volatile foi encerrado, incluindo a proibição das operações «++» e «—» com tipos padrão.
- Reduzido o número de situações em que é necessário especificar o «typename» para informar sobre a presença de um tipo.
Fonte: opennet.ru
