Se ha aprobado el estándar C++20

Comité ISO de estandarización del lenguaje C++ aprobó estándar internacional "C++20". Las capacidades presentadas en la especificación, con excepción de casos aislados, son compatibles en los compiladores GCC, Clang y Microsoft Visual C++. Las bibliotecas estándar que soportan C++20 se implementan en el marco del proyecto Boost.

En los próximos dos meses, la especificación aprobada estará en la fase de preparación del documento para su publicación, donde se llevará a cabo la corrección editorial de errores ortográficos y tipográficos. A principios de noviembre, la versión resultante del documento 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 siguiente estándar C++23 (C++2b) y en la próxima reunión virtual considerará posibles novedades.

Principales características C++20 (ejemplos de código):

  • Se han añadido "conceptos", extensiones de plantillas que permiten definir un conjunto de requisitos para los parámetros de plantilla, que durante la compilación restringen el conjunto de argumentos que se pueden aceptar como parámetros de plantilla. Los conceptos pueden aplicarse para evitar incoherencias lógicas entre las propiedades de los tipos de datos utilizados dentro de la plantilla y las propiedades de los tipos de datos de los parámetros de entrada.

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

  • Se han incluido la extensión 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 basado en la definición de límites de componentes, sin incluir archivos de encabezado a través de "#include".
  • Macro __VA_OPT__ para la expansión adaptativa de macros variádicas dependiendo de la presencia de tokens en el argumento variádico.
  • Soporte para el operador "" para la comparación de tres vías.
  • Soporte para inicializadores de elementos por defecto para campos de bits.
  • Posibilidad de capturar expresiones "*this" en lambdas.

    struct int_value {
    int n = 0;
    auto getter_fn() {
    // BAD:
    // return [=]() { return n; };

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

  • Llamada de elementos mediante punteros (Pointer-to-member), usando punteros a objetos temporales definidos a través de la expresión "const &".
  • Operador delete con un destructor, descrito en el documento P0722R1.
  • A las clases se les permite el uso de parámetros de plantilla sin tipo.

    struct foo {
    foo() = default;
    constexpr foo(int) {}
    };

    template
    auto get_foo() {
    return f;
    }

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

  • Expresiones lambda no almacenadas con constructor.
  • Permisibilidad del uso de la sintaxis de plantillas para expresiones lambda («auto f = [<typename T>(std::vector<T> v)»).
  • Posibilidad de usar literales de cadena en parámetros de plantillas.
  • Soporte de sintaxis de inicialización al estilo C: campos no enumerados en la lista de inicialización se inicializan por defecto.

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

    A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2

  • Soporte para miembros vacíos en estructuras de datos.
  • Soporte para los atributos likely y unlikely para informar al optimizador sobre la probabilidad de que se cumpla una condición («[[likely]] if (random > 0) {«).
  • Posibilidad de usar rangos para inicializar valores de variables en un ciclo «for».

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

  • Cálculo automático del tamaño del arreglo en new («new double[]{1,2,3}»);
  • Atributo «[[no_unique_address]]» en el que las variables sin datos no ocupan espacio.
  • Punteros atómicos (std::atomic<shared_ptr<T>> y std::atomic<weak_ptr<T>>).
  • Posibilidad de llamar a funciones virtuales en expresiones condicionales.
  • Soporte para funciones rápidas (immediate) que solo pueden trabajar con constantes.

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

    constexpr int r = sqr(100); // OK
    int x = 100;
    int r2 = sqr(x); // ERROR: ‘x’ no puede ser usado como constante.

  • Posibilidad de aplicar constexpr con funciones virtuales («constexpr virtual int f() const { return 2; }»).
  • En la biblioteca estándar:
    • Se añadió soporte para el tipo char8_t para cadenas UTF-8.
    • Se añadieron los archivos de encabezado bit (operaciones de bits) y version.
    • Ahora es posible comprobar prefijos y sufijos en cadenas (starts_with, ends_with).
    • Se añadieron tipos std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible y std::type_identity.
    • Se añadieron funciones std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated y std::assume_aligned.
    • En std::make_shared se añadió soporte para arreglos.
    • Se añadió la función std::to_array para convertir objetos similares a arreglos en std::array.
  • Sintaxis más conveniente para enumeraciones:

    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»;
    }
    }

  • En los índices, debido al comportamiento indefinido, se prohíbe el uso de la operación «,» («a[b,c]»). Se ha suspendido el soporte para la mayoría de las operaciones con variables declaradas con la palabra clave volatile, incluidas las operaciones «++» y «—» con tipos estándar.
  • Se ha reducido el número de situaciones en las que es necesario indicar «typename» para informar sobre la existencia de un tipo.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster