Estándar C++20 aprobado

Comité ISO de Normalización del Lenguaje C++ aprobado estándar internacional "C ++ 20". Las capacidades presentadas en la especificación, con excepción de casos aislados, soportado en compiladores GCC, Sonido metálico и Microsoft Visual C ++. Las bibliotecas estándar que admiten C++20 se implementan dentro del proyecto. Boost.

En los próximos dos meses, la especificación aprobada se encontrará en la etapa de preparación del documento para su publicación, en la que se trabajará en la corrección editorial de errores ortográficos y tipográficos. A principios de noviembre, el documento resultante se enviará a ISO para su publicación con el nombre formal ISO/IEC 14882:2020. Mientras tanto, el comité ya ha comenzado a trabajar en el próximo estándar C++23 (C++2b) y considerará posibles opciones en su próxima reunión virtual. innovaciones.

El principal Características C ++ 20 (ejemplos de código):

  • Se agregaron "conceptos", extensiones de plantilla, que le permiten definir un conjunto de requisitos de parámetros de plantilla que, en el momento de la compilación, limitan el conjunto de argumentos que se pueden aceptar como parámetros de plantilla. Los conceptos se pueden utilizar para evitar inconsistencias lógicas entre las propiedades de los tipos de datos utilizados dentro de la plantilla y las propiedades del tipo de datos de los parámetros de entrada.

    plantilla
    concepto IgualdadComparable = requiere(T a, T b) {
    { a == b } -> std::boolean;
    { a != b } -> std::boolean;
    };

  • Aceptado extensiones para trabajar con módulos que se pueden utilizar en lugar de archivos de encabezado. Los módulos proporcionan una nueva forma de organizar el código fuente basándose en la definición de los límites de los componentes, sin incluir archivos de encabezado mediante "#include".
  • Macro __VA_OPT__ para la expansión adaptativa de macros variables dependiendo de la presencia de tokens en el argumento variable.
  • Soporte para el operador "" para comparación de tres vías.
  • Soporte para inicializadores de elementos predeterminados para campos de bits.
  • Capacidad de capturar expresiones lambda "*this".

    estructura int_value {
    int n = 0;
    captador automático_fn() {
    //MALO:
    // retorno [=]() { retorno n; };

    // BIEN:
    return [=, *this]() { return n; };
    }
    };

  • Llamar a elementos por puntero (Puntero a miembro), utilizando punteros a objetos temporales definidos a través de la expresión “const &”.
  • El operador de eliminación con un destructor descrito en el documento. P0722R1.
  • Las clases pueden utilizar parámetros de plantilla sin un tipo.

    estructura foo {
    foo() = predeterminado;
    constexpr foo(int) {}
    };

    plantilla
    auto get_foo() {
    devolver f;
    }

    get_foo(); // usa un constructor implícito
    get_foo ();

  • Expresiones lambda no persistentes con constructor.
  • Permitir la sintaxis de plantilla para expresiones lambda (“auto f = [] (estándar::vector v)").
  • Posibilidad de utilizar cadenas literales en parámetros de plantilla.
  • Compatibilidad con la sintaxis de inicialización de estilo C: los campos que no figuran explícitamente en la lista de inicialización se inicializan de forma predeterminada.

    estructura A {
    int x;
    int y;
    int z = 123;
    };

    A a {.x = 1, .z = 2}; // hacha == 1, ay == 0, az == 2

  • Soporte para miembros de estructuras de datos vacías.
  • Soporte para los atributos probable e improbable para informar al optimizador sobre la probabilidad de que se active la construcción condicional ("[[probable]] si (aleatorio > 0) {").
  • Capacidad de utilizar rangos para inicializar valores de variables en un bucle "for"

    for (auto v = std::vector{1, 2, 3}; auto& e : v) {

  • Cálculo automático del tamaño de la matriz en nuevo ("nuevo doble[]{1,2,3}");
  • El atributo “[[no_unique_address]]” en el que las variables sin datos no ocupan espacio.
  • Punteros atómicos (std::atomic > y std::atómico >).
  • Capacidad para llamar funciones virtuales en expresiones condicionales.
  • Soporte para funciones inmediatas que solo pueden funcionar con constantes.

    consteval int sqr(int n) {
    devolver n * n;
    }

    constexpr int r = sqr(100); // DE ACUERDO
    int x = 100;
    int r2 = cuadrado(x); // ERROR: 'x' no se puede utilizar como constante

  • Posibilidad de utilizar constexpr con funciones virtuales (“constexpr virtual int f() const { return 2; }”).
  • En la biblioteca estándar:
    • Se agregó soporte para el tipo char8_t para cadenas UTF-8.
    • Se agregaron bits de archivos de encabezado (operaciones de bits) y versión.
    • Ahora es posible comprobar el prefijo y el sufijo de las cadenas (empieza_con, termina_con).
    • Se agregaron los rasgos std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible y std::type_identity.
    • Se agregaron funciones std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated y std::assume_aligned.
    • Se agregó soporte para matrices a std::make_shared.
    • Se agregó la función std::to_array para convertir objetos tipo matriz a std::array.
  • Sintaxis de enumeración más conveniente:

    clase de enumeración rgba_color_channel {rojo, verde, azul, alfa};

    std::string_view to_string(rgba_color_channel mi_canal) {
    cambiar (mi_canal) {
    usando enumeración rgba_color_channel;
    caso rojo: devuelve "rojo";
    caso verde: devuelve "verde";
    caso azul: devuelve "azul";
    caso alfa: devuelve "alfa";
    }
    }

  • En los índices, debido al comportamiento indefinido, está prohibido el uso de la operación “,” (“a[b,c]”). Se ha suspendido la compatibilidad con la mayoría de las operaciones con variables declaradas con la palabra clave volátil, incluidas las operaciones “++” y “—” con tipos estándar.
  • Se redujo la cantidad de situaciones en las que se requiere "nombre de tipo" para indicar la presencia de un tipo.

Fuente: opennet.ru

Añadir un comentario