C++20

De Wikipedia, la enciclopedia libre

El lenguaje de programación C++ está estandarizado por ISO/IEC, quienes publican una revisión cada 3 años desde 2011. C++20 es el nombre de la revisión del año 2020, que sigue a C++17.[1]​ La próxima revisión será C++23.

El estándar quedó técnicamente concluido por WG21 en la reunión en Praga en febrero de 2020[2][3]​ y pasó la aprobación final el 4 de septiembre de 2020.[4][5][6]​ En octubre de 2020 se encontraba en la etapa de trabajo editorial final.

C++20 añade más características importantes que C++14 o C++17.[7]​ Abajo se listan algunas de estas características.[8]

Características nuevas[editar]

C++20 introdujo muchas características nuevas, siendo la versión que más cambios introdujo en el lenguaje. Las siguientes listas sólo mencionan algunas de estas características. El artículo Descripción de las nuevas características de C++20 profundiza en su descripción.

Principales novedades[editar]

De la multitud de cambios introducidos, cuatro características largamente esperadas y potencialmente transformadoras, conocidas como the big four,[9]​ se destacan sobre el resto:

Estas características nuevas se repiten en las siguientes listas más completas.

Lenguaje[editar]

Novedades en el lenguaje:

  • conceptos[10][11]
  • módulos[12]
  • inicializadores designados[12][14]​ (basado en la característica de C99, que además es una extensión común de G++)[14]
  • [=, this] como captura lambda[15]
  • plantillas (templates) en lambdas[16]
  • comparación de tres sentidos con operator <=>
  • una nueva inicialización de variables dentro de un range-based for[17]
  • lambdas en contextos no evaluados[18][19]
  • lambdas sin estado asignables con constructores por defecto[20]
  • admite expansiones de paquete en una captura lambda init-capture[21]
  • strings literales como parámetros de plantilla[22]
  • se retira la necesidad de typename en ciertas circunstancias[23]
  • nuevos atributos estándares [[no_unique_address]] , [[likely]] y [[unlikely]][24][25]
  • constexpr expandido a varios casos[26][27][28][29][30]
  • funciones inmediatas utilizan la nueva palabra clave consteval[31]
  • enteros con signo ahora defidos en complemento a dos (el desbordamiento sigue siendo comportamiento indefinido)[32]
  • modelo de memoria revisado[33]
  • mejoras en structured bindings (interacción con capturas de lambda, duración de almacenamiento estático y local de hilo)[34][35]
  • corrutinas[13]
  • using en enums[36]
  • nueva palabra claveconstinit [37]

Bibliotecas[editar]

Novedades en la biblioteca estándar:

  • rangos[38]
  • std::make_shared y std::allocate_shared para arrays[39]
  • smart pointers atómicos (como std::atomic<shared_ptr<T>> and std::atomic<weak_ptr<T>>)[40]
  • std::to_address para convertir un puntero a un puntero crudo[41]
  • agregados de calendario y zonas horarias en <chrono>[42]
  • std::span proporciona una vista de un array contiguo (similar a std::string_view pero mutable)[43]
  • <version> [44]
  • std::bit_cast<> para el casting de objetos, menos verborrágico que memcpy()[45]
  • macros para evaluar características[46]
  • varios constexpr[47]
  • inicialización por defecto para la creación de smart pointers[48]
  • nuevo método std::map::contains [49]
  • operaciones de bit, como cuenta de ceros o unos iniciales o finales,[50]​ operaciones log2,[51][52][53]std::popcount

Obsolescencia[editar]

  • uso de comas en subíndices, como en array[x,y] [54]
  • volatile se volvió obsoleto en la mayoría de sus formas[55]

Nuevas palabras clave[editar]

Algunas palabras clave nuevas en C++20:

  • asociadas a const
    • constinit
    • consteval
  • asociadas a corrutinas
    • co_await
    • co_return
    • co_yield
  • asociadas a módulos
    • import
    • module
    • requires
    • export
  • atributos[56]
    • [[likely]]
    • [[unlikely]]
    • [[no_unique_address]]

Características publicadas como Especificaciones Técnicas[editar]

Aquellas partes mayores que implican un gran trabajo de especificación se llevan a cabo de forma desacoplada de las versiones de C++ , y manejan su propio calendario. Estos trabajos se conocen como "Especificaciones Técnicas" abreviados TS (Technical Specification).

  • Paralelismo: Parallelism TS v2 (incluyendo bloques de tarea)[57][58]
  • Redes: Networking TS v1[59]
  • Reflexión: Reflection TS v1[60]

Se espera que formen parte de C++23.

Características reprogramadas para futuros estándares[editar]

Una de las etapas en la preparación de cada versión consiste en determinar qué características solicitadas se incluyen en la versión actual, y cuáles se postergan.

La postergación de una característica no asegura su inclusión en la versión siguiente ni garantiza que alguna vez sea lanzada.

Una característica postergada sigue recibiendo atención, y su inclusión en una versión depende, entre otras cosas, del estado de avance de su especificación.

Entre las características reprogramadas es común encontrar aquellas que cuentan con su propia especificación técnica (lo que implica que siguen su propio calendario de especificación).

Algunas características reprogramadasː

  • Contratos
    • un grupo de estudio nuevo (SG21) ha sido formado para trabajar en una propuesta nueva[61]
  • Reflexión[62][63]
  • Metaclasses[64]
  • Ejecutores[65]
  • Extensiones de Networking incluyendo
    • async
    • servicios básicos de I/O
    • temporizadores
    • buffers
    • flujos orientados a buffers
    • sockets
    • protocolos de Internet (bloqueado por ejecutores)[66][67]
  • Propiedades[68]
  • Futuros extendidos[69]

Soporte por compiladores[editar]

En el pasado los compiladores comenzaban a soportar parcialmente una versión de C++ a partir del momento de su publicación. En la actualidad los desarrolladores de compiladores importantes se anticipan al estándar final implementando soporte experimental para varias características a partir de los borradores.

  • Clang tiene soporte parcial C++20 habilitado con la opción -std=c++20 (versión 10 o posterior) o -std=c++2un (versión 9 y anteriores).[70]
  • GCC Añadió soporte parcial y experimental de C++20 en 2017 en su versión 8 por medio de la opción -std=c++2a.[71]​ Como Clang, GCC reemplazó esta opción con -std=c++20 en su versión 10. También tiene una opción para habilitar extensiones GNU junto con el soporte experimental de C++20, -std=gnu++20.[72]
  • Microsoft Visual Studio soporta algunas características de C++20 a través de la opción std:c++latest.

Véase también[editar]

Referencias[editar]

  1. «The Standard». isocpp.org. Consultado el 7 de septiembre de 2020. 
  2. Sutter, Herb (1 de octubre de 2019). «P1000R3: C++ IS schedule». Consultado el 13 de febrero de 2020. 
  3. Dusíková, Hana (6 de noviembre de 2019). «N4817: 2020 Prague Meeting Invitation and Information». Consultado el 13 de febrero de 2020. 
  4. «Current Status : Standard C++». isocpp.org. Consultado el 25 de octubre de 2020. 
  5. «Current Status». isocpp.org. Consultado el 7 de septiembre de 2020. 
  6. «C++20 Approved -- Herb Sutter». isocpp.org. Consultado el 8 de septiembre de 2020. 
  7. «Why does the C++ standard ship every three years?». 
  8. «P0592R0: To boldly suggest an overall plan for C++20». 
  9. «The big four (en inglés)». 
  10. a b «P0606R0: Concepts Are Ready». 
  11. a b «P1141R1 - Yet another approach for constrained declarations». 
  12. a b c «N4720: Working Draft, Extensions to C++ for Modules». 
  13. a b «N4649: Working Draft, Technical Specification on C++ Extensions for Coroutines». 
  14. a b Tim Shen. «Designated Initialization Wording». 
  15. Thomas Köppe. «Allow lambda capture [=, this]». 
  16. «Familiar template syntax for generic lambdas». 
  17. «Range-based for statements with initializer». 
  18. «Trip Report: C++ Standards Meeting in Albuquerque, November 2017» (en inglés estadounidense). 20 de noviembre de 2017. Consultado el 11 de diciembre de 2017. 
  19. «Wording for lambdas in unevaluated contexts». 
  20. «Default constructible and assignable stateless lambdas». 
  21. «Pack expansion in lambda init-capture». www.open-std.org. Consultado el 11 de diciembre de 2017. 
  22. «String literals as non-type template parameters». 
  23. Nina Ranns. «Down with typename!». 
  24. «Language support for empty objects». 
  25. «Proposed wording for likely and unlikely attributes (Revision 5)». 
  26. «Allowing Virtual Function Calls in Constant Expressions». www.open-std.org. Consultado el 11 de marzo de 2019. 
  27. «P1330R0 - Changing the active member of a union inside constexpr». 
  28. «P1002R0 - Try-catch blocks in constexpr functions». 
  29. «P1327R0 - Allowing dynamic_cast, polymorphic typeid in Constant Expressions». 
  30. «P1006R1 - Constexpr in std::pointer_traits». 
  31. «P1073R2 - Immediate functions». 
  32. «P1236R0: Alternative Wording for P0907R4 Signed Integers are Two's Complement». 
  33. «P0668R4: Revising the C++ memory model». 
  34. «P1091R1: Extending structured bindings to be more like variable declarations». www.open-std.org. Consultado el 24 de febrero de 2019. 
  35. «P1091R2: Extending structured bindings to be more like variable declarations». www.open-std.org. Consultado el 24 de febrero de 2019. 
  36. «P1099R5: Using Enum». www.open-std.org. 20 de julio de 2019. Consultado el 20 de julio de 2019. 
  37. «P1143R2: Adding the constinit keyword». www.open-std.org. 20 de julio de 2019. Consultado el 20 de julio de 2019. 
  38. «P0896R3». 
  39. «Extending make_shared to Support Arrays». 
  40. Meredith, Alisdair. «Revising atomic_shared_ptr for C++20». JTC1/SC22/WG21 - The C++ Standards Committee - ISOCPP. ISO. Consultado el 27 de diciembre de 2018. 
  41. «Utility to convert a pointer to a raw pointer». 
  42. Howard E. Hinnant. «Extending <chrono> to Calendars and Time Zones». 
  43. Neil MacIntosh. «span: bounds-safe views for sequences of objects». 
  44. Alan Talbot. «<version>». 
  45. «Bit-casting object representations». www.open-std.org. Consultado el 10 de noviembre de 2018. 
  46. «Integrating feature-test macros into the C++ WD». www.open-std.org. Consultado el 10 de noviembre de 2018. 
  47. «P1032R1 - Misc constexpr bits». 
  48. «Smart pointer creation with default initialization». 
  49. «std::map::contains - cppreference.com». en.cppreference.com. Consultado el 12 de mayo de 2020. 
  50. «P0553R4: Bit operations». www.open-std.org. 20 de julio de 2019. Consultado el 20 de julio de 2019. 
  51. «P0556R3: Integral power-of-2 operations». www.open-std.org. 6 de junio de 2018. Consultado el 8 de agosto de 2020. 
  52. «P1355R2 Exposing a narrow contract for ceil2». www.open-std.org. 11 de junio de 2019. Consultado el 8 de agosto de 2020. 
  53. «On the names of low-level bit manipulation functions». www.open-std.org. 11 de febrero de 2020. Consultado el 8 de agosto de 2020. 
  54. «P1161R2: Deprecate uses of the comma operator in subscripting expressions». www.open-std.org. Consultado el 20 de julio de 2019. 
  55. «P1152R4: Deprecating volatile». www.open-std.org. 20 de julio de 2019. Consultado el 20 de julio de 2019. 
  56. «attribute specifier sequence(since C++11) - cppreference.com». en.cppreference.com. Consultado el 4 de agosto de 2019. 
  57. «C++ Extensions for Parallelism Version 2». 
  58. «Task Blocks». 
  59. «C++ Extensions for Networking». 
  60. «C++ Extensions for Reflection». 
  61. Sutter, Herb (20 de julio de 2019). «Trip report: Summer ISO C++ standards meeting (Cologne)». Sutter's Mill (en inglés). Consultado el 21 de julio de 2019. 
  62. «Reflections on the reflection proposals - Meeting C++». meetingcpp.com (en inglés). Consultado el 30 de junio de 2017. 
  63. «Static reflection». www.open-std.org. Consultado el 10 de noviembre de 2018. 
  64. Herb Sutter. «Metaclasses». 
  65. «A Unified Executors Proposal for C++». www.open-std.org. Consultado el 24 de febrero de 2019. 
  66. «N4771: Working Draft, C++ Extensions for Networking». 
  67. «ISO/IEC TS 19216:2018 Programming Languages -- C++ Extensions for Networking». 
  68. «A General Property Customization Mechanism». www.open-std.org. Consultado el 24 de febrero de 2019. 
  69. «A Unified Futures Proposal for C++». 
  70. https://clang.llvm.org/cxx_status.html
  71. https://gcc.gnu.org/legacy-ml/gcc-patches/2017-07/msg01234.html
  72. https://gcc.gnu.org/projects/cxx-status.html

Enlaces externos[editar]

  • JTC1/SC22/WG21 – ISO/IEC C++ Standard Working Group (conocido como el Comité de Estándares de C++)
  • Repositorio de rangos (ranges-v3), por Eric Niebler