C++17
De cppreference.com
< cpp
| Esta sección está incompleta |
Las siguientes características fueron fusionadas en C++17:
- De las especificaciones técnicas: la biblioteca de sistema de archivos, la biblioteca de fundamentos v1 (incluyendo optional, any, string_view, asignadores polimórficos, buscadores, apply), paralelismo v1 (incluyendo políticas de ejecución, reduce, inclusive_scan, exclusive_scan), pero se eliminó
exception_list. De la especificación técnica de funciones especiales: funciones matemáticas especiales, de la biblioteca de fundamentos v2: std::gcd, std::lcm - De C11: std::aligned_alloc, std::timespec_get
Sumario
Eliminados y obsoletos/en desuso
Eliminados
auto_ptr, objetos función obsoletos, std::random_shuffle, std::unexpected, los alias de iostreams obsoletos, trígrafos, la palabra clave register, incremento del tipo bool
Obsoletos/en desuso
std::iterator,
std::raw_storage_iterator,
std::get_temporary_buffer,
std::is_literal_type,
std::result_of,
todo el archivo de encabezado <codecvt>
Nuevas características del lenguaje
- Expresiones de pliegue
- Deducción de argumentos de plantillas de clase
- Parámetros de plantilla
autode no tipo - if constexpr en tiempo de compilación
- Variables en línea
- Vínculos estructurados
- if y switch con un inicializador
- Literal de carácter u8
- Espacios de nombres anidados simplificados
- La declaración using puede declarar nombres múltiples
- noexcept es parte del sistema de tipos
- Nuevas reglas de orden de evaluación
- Elisión de copia obligatoria
- Captura de lambda de *this
- Lambda constexpr
- Atributos que los espacios de nombres no tienen que repetir
- Nuevos atributos
[[fallthrough]],[[nodiscard]]y[[maybe_unused]]. - __has_include
Nuevos archivos de encabezado
Nuevas características de la biblioteca
En utility
En memory
- Herramientas de memoria sin inicializar
- weak_from_this
- Asignadores de memoria polifórmicos
- aligned_alloc
- owner_less transparente
- Soporte de arrays para shared_ptr
- Funciones de asignación con alineamiento explícito
- Guarda de cerrojo variádica
- Interfaz de líneas de caché
En types
- byte
- conjunction/disjunction/negation
- Rasgos de tipo con sufijo _v
- is_swappable
- is_invocable
- is_aggregate
- has_unique_object_representations.
En algorithm
Relacionados con contenedores
map/setextract ymap/setmergemap/unoredered_maptry_emplace e insert_or_assign- Iteradores contiguos
- Plantillas de función size/empty/data
En numeric
Otras
- is_always_lock_free
- uncaught_exceptions
- timespec_get
- Funciones de redondeo para duration y time_point
Informes de defectos
Soporte de compiladores
Artículo principal: Soporte de compiladores de C++
Características principales del lenguaje C++17
| Característica de C++17 |
Ponencia(s) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
IBM XLC++ |
Sun/Oracle C++ |
Embarcadero C++ Builder |
Cray |
Portland Group (PGI) |
Nvidia nvcc |
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ID: Nuevas reglas de auto para inicialización de lista directa
|
[https://wg21.link/N3922 [HTTPS://WG21.LINK/N3922 [1] N3922]] |
6 | 3.9 | 19.12* | Sí | 4.14 | 19.0 | 19.1 | 11.0 | |||||
| static_assert sin mensaje | [https://wg21.link/N3928 [HTTPS://WG21.LINK/N3928 [2] N3928]] |
6 | 2.5 | 19.10* | Sí | 4.12 | 18.0 | 17.7 | 11.0 | |||||
typename en un parámetro de plantilla de plantilla
|
[https://wg21.link/N4051 [HTTPS://WG21.LINK/N4051 [3] N4051]] |
5 | 3.5 | 19.0 (2015)* | Sí | 4.10.1 | 17.0 | 17.7 | Sí* | |||||
| Eliminar trígrafos | [https://wg21.link/N4086 [HTTPS://WG21.LINK/N4086 [4] N4086]] |
5 | 3.5 | 16.0* | Sí | 5.0 | 19.1 | 11.0 | ||||||
| Definición de espacios de nombre anidados | [https://wg21.link/N4230 [HTTPS://WG21.LINK/N4230 [5] N4230]] |
6 | 3.6 | 19.0 (Update 3)* | Sí | 4.12 | 17.0 | 17.7 | 11.0 | |||||
| Atributos para espacios de nombre y enumeradores | [https://wg21.link/N4266 [HTTPS://WG21.LINK/N4266 [6] N4266]] |
4.9 (partial)* 6 |
3.6 | 19.0 (2015)* | Sí | 4.11 | 17.0 | 17.7 | 11.0 | |||||
Literales de carácter u8
|
[https://wg21.link/N4267 [HTTPS://WG21.LINK/N4267 [7] N4267]] |
6 | 3.6 | 19.0 (2015)* | Sí | 4.11 | 17.0 | 17.7 | 11.0 | |||||
| Permitir evaluación constante para todos los argumentos de plantilla de no tipo | [https://wg21.link/N4268 [HTTPS://WG21.LINK/N4268 [8] N4268]] |
6 | 3.6 | 19.12* | Sí | 5.0 | 19.0.1 | 19.1 | 11.0 | |||||
| Expresiones de pliegue | [https://wg21.link/N4295 [HTTPS://WG21.LINK/N4295 [9] N4295]] |
6 | 3.6 | 19.12* | Sí | 4.14 | 19.0 | 18.1 | 11.0 | |||||
| Expresiones de pliegue unarias y paquetes de parámetros vacíos | [https://wg21.link/P0036R0 [HTTPS://WG21.LINK/P0036R0 [10] P0036R0]] |
6 | 3.9 | 19.12* | Sí | 4.14 | 19.0 | 19.1 | 11.0 | |||||
| Eliminar uso obsoleto de la palabra clave register | [https://wg21.link/P0001R1 [HTTPS://WG21.LINK/P0001R1 [11] P0001R1]] |
7 | 3.8 | 19.11* | Sí | 4.13 | 18.0 | 17.7 | 11.0 | |||||
Remover operator++(bool) obsoleto
|
[https://wg21.link/P0002R1 [HTTPS://WG21.LINK/P0002R1 [12] P0002R1]] |
7 | 3.8 | 19.11* | Sí | 4.13 | 18.0 | 17.7 | 11.0 | |||||
| Hacer las especificaciones de excepciones parte del sistema de tipos | [https://wg21.link/P0012R1 [HTTPS://WG21.LINK/P0012R1 [13] P0012R1]] |
7 | 4 | 19.12* | Sí | 4.14 | 19.0 | 19.1 | 11.0 | |||||
| Inicialización de agregados con clases base | [https://wg21.link/P0017R1 [HTTPS://WG21.LINK/P0017R1 [14] P0017R1]] |
7 | 3.9 | 19.14* | Sí | 5.0 | 19.0.1 | 19.1 | 11.0 | |||||
| __has_include en condicionales del preprocesador | [https://wg21.link/P0061R1 [HTTPS://WG21.LINK/P0061R1 [15] P0061R1]] |
5 | Sí | 19.11* | Sí | 4.13 | 18.0 | 17.7 | 11.0 | |||||
| ID: Nueva especificación para constructores heredados (ID 1941 et al) | [https://wg21.link/P0136R1 [HTTPS://WG21.LINK/P0136R1 [16] P0136R1]] |
7 | 3.9 | 19.14* | Sí | 6.1 | 19.1 | 11.0 | ||||||
Captura de lambda de *this
|
[https://wg21.link/P0018R3 [HTTPS://WG21.LINK/P0018R3 [17] P0018R3]] |
7 | 3.9 | 19.11* | Sí | 4.14 | 19.0 | 18.1 | 11.0 | |||||
| Inicialización de lista directa de enumeraciones | [https://wg21.link/P0138R2 [HTTPS://WG21.LINK/P0138R2 [18] P0138R2]] |
7 | 3.9 | 19.11* | Sí | 4.14 | 18.0 | 19.1 | 11.0 | |||||
| Expresiones lambda constexpr | [https://wg21.link/P0170R1 [HTTPS://WG21.LINK/P0170R1 [19] P0170R1]] |
7 | 5 | 19.11* | Sí | 4.14 | 19.0 | 18.1 | 11.0 | |||||
Tipos que difieren en begin y end en bucle for basado en rango
|
[https://wg21.link/P0184R0 [HTTPS://WG21.LINK/P0184R0 [20] P0184R0]] |
6 | 3.9 | 19.10* | Sí | 4.12 | 18.0 | 17.7 | 11.0 | |||||
Atributo [[fallthrough]]
|
[https://wg21.link/P0188R1 [HTTPS://WG21.LINK/P0188R1 [21] P0188R1]] |
7 | 3.9 | 19.10* | Sí | 4.13 | 18.0 | 17.7 | 11.0 | |||||
Atributo [[nodiscard]]
|
[https://wg21.link/P0189R1 [HTTPS://WG21.LINK/P0189R1 [22] P0189R1]] |
7 | 3.9 | 19.11* | Sí | 4.13 | 18.0 | 17.7 | 11.0 | |||||
Atributo [[maybe_unused]]
|
[https://wg21.link/P0212R1 [HTTPS://WG21.LINK/P0212R1 [23] P0212R1]] |
7 | 3.9 | 19.11* | Sí | 4.13 | 18.0 | 17.7 | 11.0 | |||||
| Literales de punto flotante hexadecimales | [https://wg21.link/P0245R1 [HTTPS://WG21.LINK/P0245R1 [24] P0245R1]] |
3.0 | Sí | 19.11* | Sí | 4.13 | 18.0 | 17.7 | 11.0 | |||||
| Usar atributos de espacios de nombres sin repetición | [https://wg21.link/P0028R4 [HTTPS://WG21.LINK/P0028R4 [25] P0028R4]] |
7 | 3.9 | 19.11* | Sí | 4.13 | 18.0 | 17.7 | 11.0 | |||||
| Asignación de memoria dinámica para datos sobrealineados | [https://wg21.link/P0035R4 [HTTPS://WG21.LINK/P0035R4 [26] P0035R4]] |
7 | 4 | 19.12* |
10.0.0* |
4.14 | 19.0 | 19.1 | 11.0 | |||||
| Deducción de argumentos de plantillas de clase | [https://wg21.link/P0091R3 [HTTPS://WG21.LINK/P0091R3 [27] P0091R3]] |
7 | 5 | 19.14* | Sí | 5.0 | 19.0.1 | 19.1 | 11.0 | |||||
Parámetros de plantilla de no tipo con el tipo auto
|
[https://wg21.link/P0127R2 [HTTPS://WG21.LINK/P0127R2 [28] P0127R2]] |
7 | 4 | 19.14* | Sí | 5.0 | 19.0.1 | 19.1 | 11.0 | |||||
| Elisión de copia obligatoria | [https://wg21.link/P0135R1 [HTTPS://WG21.LINK/P0135R1 [29] P0135R1]] |
7 | 4 | 19.13* | Sí | 5.0 | 19.0.1 | 19.1 | 11.0 | |||||
| Reemplazo de objetos de clase que contienen miembros de referencia | [https://wg21.link/P0137R1 [HTTPS://WG21.LINK/P0137R1 [30] P0137R1]] |
7 | 6 | 19.14* | Sí | 5.0 | 19.1 | 11.0 | ||||||
| Orden de evaluación de expresiones más estricto | [https://wg21.link/P0145R3 [HTTPS://WG21.LINK/P0145R3 [31] P0145R3]] |
7 | 4 | 19.14* | Sí | 5.0 | 19.0.1 | 19.1 | 11.0 | |||||
| Vínculos estructurados | [https://wg21.link/P0217R3 [HTTPS://WG21.LINK/P0217R3 [32] P0217R3]] |
7 | 4 | 19.11* | Sí | 4.14 | 19.0 | 18.1 | 11.0* | |||||
| Ignorar atributos desconocidos | [https://wg21.link/P0283R2 [HTTPS://WG21.LINK/P0283R2 [33] P0283R2]] |
Sí | 3.9 | 19.11* | Sí | 4.13 | 18.0 | 17.7 | 11.0 | |||||
| Instrucciones constexpr if | [https://wg21.link/P0292R2 [HTTPS://WG21.LINK/P0292R2 [34] P0292R2]] |
7 | 3.9 | 19.11* | Sí | 4.14 | 19.0 | 18.1 | 11.0 | |||||
| if y switch con un inicializador | [https://wg21.link/P0305R1 [HTTPS://WG21.LINK/P0305R1 [35] P0305R1]] |
7 | 3.9 | 19.11* | Sí | 4.14 | 18.0 | 18.1 | 11.0 | |||||
| Variables en línea | [https://wg21.link/P0386R2 [HTTPS://WG21.LINK/P0386R2 [36] P0386R2]] |
7 | 3.9 | 19.12* | Sí | 4.14 | 19.0 | 18.1 | 11.0 | |||||
| Eliminar especificaciones de excepciones dinámicas | [https://wg21.link/P0003R5 [HTTPS://WG21.LINK/P0003R5 [37] P0003R5]] |
7 | 4 | 19.10* | Sí | 4.14 | 19.0 | 19.1 | 11.0 | |||||
| Expansión de paquetes en declaraciones using | [https://wg21.link/P0195R2 [HTTPS://WG21.LINK/P0195R2 [38] P0195R2]] |
7 | 4 | 19.14* | Sí | 5.0 | 19.0 | 19.1 | 11.0 | |||||
| ID: Coincidencia de argumentos de plantilla de plantilla excluye plantillas compatibles | [https://wg21.link/P0522R0 [HTTPS://WG21.LINK/P0522R0 [39] P0522R0]] |
7 | 4 | 19.12* | Sí | 5.0 | 19.0.1 | 19.1 | 11.0 | |||||
| Característica de C++17 |
Ponencia(s) |
GCC |
Clang |
MSVC |
Apple Clang |
EDG eccp |
Intel C++ |
IBM XLC++ |
Sun/Oracle C++ |
Embarcadero C++ Builder |
Cray |
Portland Group (PGI) |
Nvidia nvcc |
Características de la biblioteca de C++17
| Característica de C++17 |
Ponencia(s) |
GCC libstdc++ |
Clang libc++ |
MSVC Biblioteca Estándar |
Apple Clang |
Intel Parallel STL |
Sun/Oracle C++ Biblioteca Estándar |
Embarcadero C++ Builder Biblioteca Estándar |
Cray C++ Biblioteca Estándar |
|
|---|---|---|---|---|---|---|---|---|---|---|
| std::void_t | N3911 | 6 | 3.6 | 19.0 (2015)* | Sí | N/A | 10.3 | |||
| std::uncaught_exceptions() | N4259 | 6 | 3.7 | 19.0 (2015)* | Sí | N/A | 10.3 | |||
| std::size(), std::empty() y std::data() | N4280 | 6 | 3.6 | 19.0 (2015)* | Sí | N/A | 10.3 | |||
| Mejorar std::pair y std::tuple | N4387 | 6 | 4 | 19.0 (Update 2)* | Sí | N/A | 10.3 | |||
| std::bool_constant | N4389 | 6 | 3.7 | 19.0 (2015)* | Sí | N/A | 10.3 | |||
| std::shared_mutex (sin tiempo) | N4508 | 6 | 3.7 | 19.0 (Update 2)* | Sí | N/A | 10.3 | |||
| Rasgos de tipo de plantillas de variable | P0006R0 | 7 | 3.8 | 19.0 (Update 2)* | Sí | N/A | 10.3 | |||
| Rasgos de tipo para operadores lógicos | P0013R1 | 6 | 3.8 | 19.0 (Update 2)* | Sí | N/A | 10.3 | |||
| Estandarización de la especificación técnica de paralelismo | P0024R2 | 9* | 19.14* | 18.0* | ||||||
| std::clamp() | P0025R0 | 7 | 3.9 | 19.0 (Update 3)* |
10.0.0* |
N/A | 10.3 | |||
| Tamaño de interferencia de hardware | P0154R1 | 12 | 19.11* | N/A | 10.3 | |||||
| Rasgos de tipo intercambiables (nothrow) | P0185R1 | 7 | 3.9 | 19.0 (Update 3)* |
10.0.0* |
N/A | 10.3 | |||
| Biblioteca de sistema de archivos | P0218R1 | 8 | 7 | 19.14* |
11.0.0* |
N/A | 10.3 | |||
| std::string_view | N3921 P0220R1 |
7 | 4 | 19.10* |
10.0.0* |
N/A | 10.3 | |||
| std::any | P0220R1 | 7 | 4 | 19.10* |
10.0.0* |
N/A | 10.3 | |||
| std::optional | P0220R1 | 7 | 4 | 19.10* |
10.0.0* |
N/A | 10.3 | |||
| Recursos de memoria polimórficos | P0220R1 | 9 | 19.13* | N/A | 10.3 | |||||
| Funciones matemáticas especiales | P0226R1 | 7 | 19.14* | N/A | 10.3 | |||||
| C++17 debe referirse a C11 en lugar de C99 | P0063R3 | 9 | 7 | 19.0 (2015)* (parcial)* |
10.0.0* |
N/A | ||||
| Mapas y Conjuntos (maps/sets) unidos | P0083R3 | 7 | 8 | 19.12* |
10.0.0* |
N/A | ||||
| std::variant | P0088R3 | 7 | 4 | 19.10* |
10.0.0* |
N/A | 10.3 | |||
| std::make_from_tuple() | P0209R2 | 7 | 3.9 | 19.10* | Sí | N/A | 10.3 | |||
| std::has_unique_object_representations | P0258R2 | 7 | 6 | 19.11* | Sí | N/A | 10.3 | |||
| std::gcd() y std::lcm() | P0295R0 | 7 | 4 | 19.11* | Sí | N/A | 10.3 | |||
| std::not_fn | P0005R4 P0358R1 |
7 | 3.9 | 19.12* | Sí | N/A | 10.3 | |||
| Conversiones elementales de cadenas | P0067R5 | 8 (no punto flotante) 11 |
7 (no punto flotante) 14 (no punto flotante from_chars) |
19.14* (no punto flotante)* 19.24* |
10.0.0* (no punto flotante) |
N/A | 10.3 (no punto flotante from_chars) | |||
| std::shared_ptr y std::weak_ptr con apoyo para arrays | P0414R2 | 7 | 11 | 19.12* |
12.0.0* |
N/A | 10.3 | |||
| std::scoped_lock | P0156R2 | 7 | 5 | 19.11* | Sí | N/A | 10.3 | |||
| std::byte | P0298R3 | 7 | 5 | 19.11* | Sí | N/A | 10.3 | |||
| std::is_aggregate | LWG2911 | 7 | 5 | 19.15* | Sí | N/A | 10.3 | |||
| Característica de C++17 |
Ponencia(s) |
GCC libstdc++ |
Clang libc++ |
MSVC Biblioteca Estándar |
Apple Clang |
Intel Parallel STL |
Sun/Oracle C++ Biblioteca Estándar |
Embarcadero C++ Builder Biblioteca Estándar |
Cray C++ Biblioteca Estándar |
Notas:
- A partir de 2020-11-20, el último lanzamiento de Oracle Developer Studio es 12.6. Su documentación no menciona C++17.
* - planea sobre el número de versión para ver las notas