Comité ISO de Normalización da Linguaxe C++ aprobado estándar internacional"C ++ 20". As capacidades presentadas na especificación, con excepción de casos illados, apoiado en compiladores GCC, berrar и Microsoft Visual C ++. No proxecto están implementadas bibliotecas estándar que admiten C++20 Impulsar.
Nos próximos dous meses, o prego aprobado estará na fase de elaboración do documento para a súa publicación, no que se traballará na corrección editorial de erros ortográficos e tipográficos. A principios de novembro, o documento resultante enviarase a ISO para a súa publicación baixo o nome formal ISO/IEC 14882:2020. Mentres tanto, o comité xa comezou a traballar no próximo estándar C++23 (C++2b) e considerará posibles opcións na súa próxima reunión virtual. innovacións.
Engadíronse "conceptos", extensións de modelo, que permiten definir un conxunto de requisitos de parámetros de modelo que, no momento da compilación, limitan o conxunto de argumentos que se poden aceptar como parámetros de modelo. Os conceptos pódense utilizar para evitar inconsistencias lóxicas entre as propiedades dos tipos de datos utilizados dentro do modelo e as propiedades dos tipos de datos dos parámetros de entrada.
modelo
concepto IgualdadeComparable = require(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
};
Aceptada ampliación para traballar con módulos que se poden usar en lugar de ficheiros de cabeceira. Os módulos proporcionan unha nova forma de organizar o código fonte baseado na definición dos límites dos compoñentes, sen incluír ficheiros de cabeceira mediante "#include".
Macro __VA_OPT__ para a expansión adaptativa de macros variables dependendo da presenza de tokens no argumento da variable.
Soporte para o operador "" para a comparación de tres vías.
Soporte para inicializadores de elementos predeterminados para campos de bits.
Capacidade para capturar expresións lambda "*this".
struct int_value {
int n = 0;
auto getter_fn() {
// MAL:
// retorno [=]() { retorno n; };
// BO:
retorno [=, *este]() { retorno n; };
}
};
Chamar elementos por punteiro (punteiro a membro), usando punteiros a obxectos temporais definidos mediante a expresión "const &".
O operador de eliminación cun destrutor descrito no documento P0722R1.
As clases poden usar parámetros de modelo sen un tipo.
get_foo(); // usa o construtor implícito
get_foo ();
Expresións lambda non persistentes con constructor.
Permitir a sintaxe do modelo para expresións lambda ("auto f = [] (std::vector v)").
Capacidade de usar literais de cadea nos parámetros do modelo.
Compatibilidade coa sintaxe de inicialización de estilo C: os campos que non aparecen explícitamente na lista de inicialización inícianse por defecto.
estrutura A {
intx;
int y;
int z = 123;
};
A a {.x = 1, .z = 2}; // ax == 1, ay == 0, az == 2
Soporte para membros baleiros da estrutura de datos.
Compatibilidade cos atributos probables e improbables para informar ao optimizador sobre a probabilidade de que se desencadee a construción condicional ("[[probable]] se (aleatoria > 0) {").
Capacidade de usar intervalos para inicializar valores variables nun bucle "for".
para (auto v = std::vector{1, 2, 3}; auto& e : v) {
Cálculo automático do tamaño da matriz en novo ("new double[]{1,2,3}");
O atributo “[[no_unique_address]]” no que as variables sen datos non ocupan espazo.
Punteros atómicos (std::atomic > e std::atomic >).
Capacidade para chamar funcións virtuais en expresións condicionais.
Soporte para funcións inmediatas que só poden funcionar con constantes.
consteval int sqr(int n) {
retorno n * n;
}
constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // ERRO: 'x' non se pode usar como constante
Posibilidade de usar constexpr con funcións virtuais (“constexpr virtual int f() const { return 2; }”).
Na biblioteca estándar:
Engadido soporte para o tipo char8_t para cadeas UTF-8.
Engadidos ficheiros de cabeceira bit (operacións de bits) e versión.
Agora é posible comprobar o prefixo e o sufixo das cadeas (comeza_con, remata_con).
Engadíronse os trazos std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible e std::type_identity.
Engadiron funcións std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated e std::assume_aligned.
Engadido soporte para matrices a std::make_shared.
Engadiuse a función std::to_array para converter obxectos tipo matriz en std::array.
std::string_view to_string(rgba_color_channel my_channel) {
cambiar (meu_canle) {
usando a enumeración rgba_color_channel;
case vermello: devolve "vermello";
caso verde: devolve "verde";
caso azul: devolve "azul";
case alpha: devolve "alfa";
}
}
Nos índices, debido ao comportamento indefinido, está prohibido o uso da operación “,” (“a[b,c]”). O soporte para a maioría das operacións con variables declaradas coa palabra clave volátil foi descontinuada, incluídas as operacións "++" e "—" con tipos estándar.
Reduciuse o número de situacións nas que se require "typename" para indicar a presenza dun tipo.