C++17 es una versión del estándar ISO / IEC 14882 para el lenguaje de programación C++ . C++17 reemplazó la versión anterior del estándar C++, llamada C++14 , y posteriormente fue reemplazada por C++20 .
Historia
Antes de que el Comité de Estándares de C++ fijara un ciclo de lanzamiento de 3 años, la fecha de lanzamiento de C++17 era incierta. En ese período, la revisión de C++17 también se denominó C++1z , siguiendo a C++0x o C++1x para C++11 y C++1y para C++14 . La especificación de C++17 alcanzó la etapa de Borrador de Estándar Internacional (DIS) en marzo de 2017. [ 1 ] [ 2 ] Este DIS fue aprobado por unanimidad, con solo comentarios editoriales, [ 3 ] y el estándar final se publicó como ISO/IEC 14882:2017 en diciembre de 2017. [ 4 ] Se hicieron pocos cambios en la Biblioteca de Plantillas Estándar de C++ , aunque algunos algoritmos en el <algorithm>encabezado recibieron soporte para paralelización explícita y se hicieron algunas mejoras sintácticas .
Nuevas características
C++17 introdujo muchas características nuevas. Las siguientes listas pueden estar incompletas.
Idioma
- Hacer que el mensaje de texto sea
static_assertopcional [ 5 ] - Permitir
typename(como alternativa aclass) en un parámetrotemplatede plantilla [ 6 ] - Nuevas reglas para
autola deducción a partir de listas de inicialización entre llaves [ 7 ] [ 8 ] - Definiciones de espacios de nombres anidados, por ejemplo, en lugar de [ 8 ] [ 9 ]
namespaceX::Y{...}namespaceX{namespaceY{...}} - Permitir atributos para espacios de nombres y enumeradores [ 10 ] [ 11 ]
- Nuevos atributos estándar y [ 12 ]
[[fallthrough]][[maybe_unused]][[nodiscard]] u8Literales de caracteres UTF-8 ( ) [ 10 ] [ 13 ] (Los literales de cadena UTF-8 existen desde C++11 ; C++17 agrega los literales de caracteres correspondientes para mayor coherencia, aunque como están restringidos a un solo byte, solo pueden almacenar códigos de control " Basic Latin " y C0 , es decir, ASCII )- Literales de punto flotante hexadecimales [ 14 ] [ 15 ]
- Uso de
autocomo tipo para un parámetro de plantilla que no es de tipo [ 16 ] - Evaluación constante para todos los argumentos de plantilla que no son de tipo [ 10 ] [ 17 ]
- Expresiones de plegado, para plantillas variádicas [ 10 ] [ 18 ]
- Un estático en tiempo de compilación
ifcon la forma [ 19 ]ifconstexpr(expression) - Declaraciones de enlace estructuradas, que permiten [ 20 ]
auto[a,b]=getTwoReturnValues(); - Inicializadores en las declaraciones
ify [ 21 ]switch - La inicialización por copia y la inicialización directa de objetos de tipo
Ta partir de expresiones prvalue de tipoT(ignorando los calificadores cv de nivel superior) no generarán constructores de copia ni de movimiento a partir de la expresión prvalue. Consulte la sección sobre eliminación de copias para obtener más información. - Algunas extensiones sobre la asignación de memoria sobrealineada [ 22 ]
- Deducción de argumentos de plantilla de clase (CTAD), que introduce guías de deducción de constructores, por ejemplo, permitiendoen lugar de requerir tipos de argumentos de constructor explícitoso una función de plantilla auxiliar adicional. [ 23 ] [ 24 ]
std::pair(5.0,false)std::pair<double,bool>(5.0,false)std::make_pair(5.0,false) - Variables en línea, que permiten definir variables en archivos de cabecera sin violar la regla de una sola definición . Las reglas son prácticamente las mismas que para las funciones en línea.
__has_include, permitiendo que la disponibilidad de un encabezado sea verificada por directivas del preprocesador [ 25 ]- Valor
__cpluspluscambiado a201703L[ 26 ] - Las especificaciones de excepción se hicieron parte del tipo de función [ 27 ]
- Las expresiones lambda pueden capturar "
*this" por valor [ 28 ]
Biblioteca
- La mayor parte de Fundamentos de Biblioteca TS I, incluyendo: [ 29 ] [ 30 ]
<string_view>encabezado:std::string_view, una referencia de solo lectura que no posee una secuencia de caracteres o una porción de cadena [ 31 ]<optional>:std::optional, para representar objetos opcionales , un tipo de datos que no siempre puede ser devuelto por un algoritmo dado con soporte para no retorno<any>:std::any, para representar cualquier tipo , que contiene un único valor de cualquier tipo
std::uncaught_exceptions, como reemplazo destd::uncaught_exceptionen el manejo de excepciones . [ 32 ] [ 10 ] Ubicado en<exception>.uncaught_exceptionscuenta el número de excepciones en el hilo actual que se han lanzado/relanzado y aún no han entrado en unacatchcláusula coincidente, mientras queuncaught_exceptionsolo detecta si el desenrollado de la pila está en curso.- Nuevas funciones de inserción
try_emplacepara estructuras de datos asociativas clave-valor (un mapa de árbol) yinsert_or_assign( un mapa hash) [ 33 ] [ 34 ]std::mapstd::unordered_map - Acceso uniforme a contenedores
std::size: ystd::empty[ 34 ]std::data[ 35 ] - Definición de " iteradores contiguos " [ 34 ] [ 36 ]
<filesystem>: una biblioteca del sistema de archivosstd::filesystem, (basada enboost::filesystem) [ 37 ]- Versiones paralelas de algoritmos STL [ 38 ]
<cmath>: funciones matemáticas especiales adicionales , incluidas integrales elípticas y funciones de Bessel [ 39 ]<variant>:std::variant, un contenedor de unión etiquetado [ 40 ]std::byte, permitiendo que char sea reemplazado por tipos de datos que pretenden modelar un byte de datos como un byte en lugar de un carácter [ 41 ]- Características de los operadores lógicos:
std::conjunction,std::disjunctionystd::negation[ 42 ] <memory_resource>encabezado, para recursos de memoria polimórfica [ 43 ]
Características eliminadas
Esta revisión de C++ no solo añadió nuevas características, sino que también eliminó algunas.
- Se eliminaron los trígrafos . [ 44 ] [ 45 ]
- Algunos tipos y funciones obsoletos se eliminaron de la biblioteca estándar , incluidos
std::auto_ptr,std::random_shuffle, y adaptadores de funciones antiguos. [ 8 ] [ 46 ] Estos fueron reemplazados en C++11 por instalaciones mejoradas comostd::unique_ptr,std::shuffle,std::bind, y lambdas. registerSe eliminó el uso (anteriormente obsoleto) de la palabra clave como especificador de clase de almacenamiento. [ 47 ] Esta palabra clave aún está reservada pero ahora no se utiliza.
Soporte del compilador
- GCC ha tenido soporte completo para las características del lenguaje C++17 desde la versión 8. [ 48 ]
- Clang 5 y versiones posteriores admiten todas las características del lenguaje C++17. [ 49 ]
- Visual Studio 2017 15.8 (MSVC 19.15) y versiones posteriores admiten todas las características del lenguaje C++17. [ 50 ] [ 51 ]
Soporte de la biblioteca
- libstdc++ desde la versión 9.1 tiene soporte completo para C++17 (8.1 sin Parallelism TS y haciendo referencia a C99 en lugar de C11) [ 52 ]
- libc++ a partir de la versión 9 tiene soporte parcial para C++17, y el resto está "en desarrollo" [ 53 ].
- Visual Studio 2017 15.8 (MSVC 19.15) Standard Library y versiones posteriores admiten todas las características de la biblioteca C++17, excepto "Elementary String Conversions" y la referencia a C99 en lugar de C11. "Elementary String Conversions" se agregó en Visual Studio 2019 16.4 [ 54 ].
Véase también
Referencias
- ↑ "N4661 Informe de los editores -- Lenguajes de programación -- C++" . 21 de marzo de 2017. Archivado del original el 4 de febrero de 2020. Consultado el 21 de marzo de 2017 .
- ↑ "ISO/IEC DIS 14882: Lenguajes de programación — C++" (PDF) . Archivado del original (PDF) el 25 de marzo de 2017.
- ↑ Herb Sutter (6 de septiembre de 2017). "C++17 está formalmente aprobado" . Archivado del original el 29 de enero de 2020. Recuperado el 12 de septiembre de 2017 .
- ↑ "ISO/IEC 14882:2017" . Archivado del original el 29/01/2013 . Consultado el 03/12/2017 .
- ↑ "N3928: Ampliación de static_assert, v2 (Walter E. Brown)" (PDF) . Archivado (PDF) del original el 11 de agosto de 2015. Consultado el 3 de abril de 2015 .
- ↑ "N4051: Permitir typename en un parámetro de plantilla de plantilla (Richard Smith)" . Archivado del original el 11 de agosto de 2015. Recuperado el 3 de abril de 2015 .
- ↑ "N3922: Nuevas reglas para la deducción automática de braced-init-list (James Dennett)" . Archivado del original el 10 de agosto de 2015. Consultado el 28 de noviembre de 2014 .
- 1 2 3 "Actualizaciones de mi informe de viaje" . Archivado del original el 19 de marzo de 2015. Consultado el 28 de noviembre de 2014 .
- ↑ "N4230: Definición de espacio de nombres anidado (Robert Kawulak, Andrew Tomazos)" . Archivado del original el 3 de agosto de 2015. Consultado el 28 de noviembre de 2014 .
- 1 2 3 4 5 "Nuevos documentos del lenguaje principal adoptados para C++17" . Archivado del original el 27 de abril de 2015. Recuperado el 15 de noviembre de 2014 .
- ↑ "N4266: Atributos para espacios de nombres y enumeradores (Richard Smith)" . Archivado del original el 6 de marzo de 2016. Consultado el 15 de noviembre de 2014 .
- ↑ "N4640: Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) . págs. 193–195 . Archivado (PDF) del original el 12 de marzo de 2017. Consultado el 9 de marzo de 2017 .
- ↑ "N4267: Adición de literales de caracteres u8 (Richard Smith)" . Archivado del original el 28/10/2015 . Consultado el 15/11/2014 .
- ↑ Thomas Köppe. "Literales de punto flotante hexadecimales para C++" . Archivado del original el 21 de septiembre de 2022. Consultado el 16 de julio de 2017 .
- ↑ "N4659: Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) . §5.13.4. Archivado (PDF) del original el 07/12/2017 . Recuperado el 24/03/2017 .
- ↑ James Touton; Mike Spertus (23-06-2016). "Declaración de parámetros de plantilla que no son de tipo con auto" . Archivado del original el 16-09-2017 . Recuperado el 08-11-2020 .
- ↑ "N4268: Permitir la evaluación constante para todos los argumentos de plantilla que no sean de tipo (Richard Smith)" . Archivado del original el 12 de marzo de 2016. Recuperado el 15 de noviembre de 2014 .
- ↑ "N4295: Expresiones de plegado (Andrew Sutton, Richard Smith)" . Archivado del original el 4 de abril de 2015. Consultado el 15 de noviembre de 2014 .
- ↑ "N4659: Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) . §9.4.1. Archivado (PDF) del original el 07-12-2017 . Recuperado el 24-03-2017 .
- ↑ "N4659: Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) . §11.5. Archivado (PDF) del original el 07/12/2017 . Consultado el 24/03/2017 .
- ↑ "Solicitudes de selección con inicializador" . Archivado del original el 6 de octubre de 2017. Consultado el 9 de octubre de 2018 .
- ↑ "Asignación dinámica de memoria para datos sobrealineados" . Archivado del original el 8 de septiembre de 2017. Consultado el 13 de marzo de 2017 .
- ↑ "Deducción de argumentos de plantillas de clase" . Archivado del original el 31/01/2019 . Consultado el 30/01/2019 .
- ↑ "CppCon 2018: Timur Doumler "Deducción de argumentos de plantillas de clase en C++17"" . YouTube . Archivado del original el 21-08-2019 . Consultado el 30-01-2019 .
- ↑ "N4640: Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) . págs. 431–433 . Archivado (PDF) del original el 12 de marzo de 2017. Consultado el 9 de marzo de 2017 .
- ↑ "N4659: Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) . §19.8. Archivado (PDF) del original el 07/12/2017 . Consultado el 24/03/2017 .
- ↑ "P0012R1: Hacer que las especificaciones de excepción formen parte del sistema de tipos, versión 5" . Archivado del original el 12 de septiembre de 2017. Consultado el 17 de diciembre de 2018 .
- ↑ "P0018R3: Captura Lambda de *this por Valor como [ =,*this ] , versión 3" . Archivado del original el 22 de agosto de 2017. Recuperado el 21 de junio de 2021 .
- ↑ "Adoptar los componentes TS de Library Fundamentals V1 para C++17 (R1)" . Archivado del original el 5 de abril de 2016. Consultado el 23 de marzo de 2016 .
- ↑ "Estado actual" . Archivado del original el 8 de septiembre de 2020.
- ↑ "std::basic_string_view - cppreference.com" . en.cppreference.com . Archivado del original el 17-06-2016 . Consultado el 23-06-2016 .
- ↑ "N4259: Redacción para std::uncaught_exceptions (Herb Sutter)" (PDF) . Archivado (PDF) del original el 29/11/2014 . Consultado el 15/11/2014 .
- ↑ "N4279: Interfaz de inserción mejorada para mapas de clave única (Thomas Köppe)" . Archivado del original el 27 de abril de 2015. Consultado el 15 de noviembre de 2014 .
- 1 2 3 "Nuevos documentos de la biblioteca estándar adoptados para C++17" . Archivado del original el 29/11/2014 . Recuperado el 15/11/2014 .
- ↑ "N4280: Tamaño de no miembro() y más (Riccardo Marcangelo)" (PDF) . Archivado (PDF) del original el 9 de marzo de 2015. Recuperado el 15 de noviembre de 2014 .
- ↑ "N4284: Iteradores contiguos (Jens Maurer)" . Archivado del original el 29/11/2014 . Consultado el 15/11/2014 .
- ↑ "Propuesta de biblioteca de sistema de archivos (Beman Dawes)" . Archivado del original el 20 de julio de 2016. Consultado el 12 de diciembre de 2015 .
- ↑ "El sistema de transcripciones de paralelismo debería estandarizarse" . Archivado del original el 5 de abril de 2016. Consultado el 23 de marzo de 2016 .
- ↑ "Funciones especiales matemáticas para C++17, v5" (PDF) . Archivado (PDF) del original el 5 de abril de 2016. Consultado el 23 de marzo de 2016 .
- ↑ "N4659: Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) . §23.7. Archivado (PDF) del original el 7 de diciembre de 2017. Consultado el 24 de marzo de 2017 .
- ↑ "Definición de un tipo de byte" (PDF) . Archivado (PDF) del original el 25/03/2017 . Recuperado el 25/03/2017 .
- ↑ "N4659: Borrador de trabajo, estándar para el lenguaje de programación C++" (PDF) . §23.15.8. Archivado (PDF) del original el 07/12/2017 . Consultado el 24/03/2017 .
- ↑ "PMR (Recursos de Memoria Polimórfica) completamente descritos -- Nico Josuttis" . Archivado del original el 28 de agosto de 2021. Consultado el 16 de noviembre de 2020 .
- ↑ "N3981: ¿¡¿Eliminar trígrafos?! (Richard Smith)" . 6 de mayo de 2014. Archivado del original el 9 de julio de 2018. Consultado el 3 de abril de 2015 .
- ↑ Comentario de IBM sobre la preparación para un futuro adverso a los trigrafos en C++17. Archivado el 11/09/2018 en Wayback Machine , documento de IBM N4210, 10/10/2014. Autores: Michael Wong, Hubert Tong, Rajan Bhakta, Derek Inglis
- ↑ "N4190: Eliminando auto_ptr, random_shuffle() y cosas antiguas <funcionales> ( Stephan T. Lavavej)" . Archivado del original el 20 de octubre de 2017. Consultado el 28 de noviembre de 2014 .
- ↑ "C++ Keywords: register" . Archivado del original el 3 de septiembre de 2018. Consultado el 3 de septiembre de 2018 .
- ↑ "Soporte para estándares de C++ en GCC - Proyecto GNU - Fundación del Software Libre (FSF)" . gcc.gnu.org . Archivado del original el 4 de abril de 2018. Consultado el 3 de abril de 2018 .
- ↑ "Clang - Estado de C++17, C++14, C++11 y C++98" . clang.llvm.org . Archivado del original el 4 de julio de 2013. Consultado el 26 de junio de 2018 .
- ↑ corob-msft. "Conformidad del lenguaje Visual C++" . docs.microsoft.com . Archivado del original el 19 de junio de 2018. Consultado el 19 de junio de 2018 .
- ↑ "Anuncio: MSVC cumple con el estándar C++" . 7 de mayo de 2018. Archivado del original el 26 de agosto de 2018. Consultado el 8 de mayo de 2018 .
- ↑ "Capítulo 1. Estado" . gcc.gnu.org . Archivado del original el 4 de junio de 2018. Consultado el 19 de junio de 2018 .
- ↑ "Estado de libc++ C++17" . llvm.org . Archivado del original el 24 de mayo de 2019. Consultado el 24 de mayo de 2019 .
- ↑ "Anuncio: MSVC cumple con el estándar C++" . devblogs.microsoft.com . 7 de mayo de 2018. Archivado del original el 26 de agosto de 2018. Consultado el 24 de mayo de 2019 .
- C++
- Familia de lenguajes de programación C++
- estándares de lenguajes de programación
- Normas IEC
- normas ISO