Namespaces
Variants

C++17

From cppreference.net

C++17 es una versión importante que sigue a la versión menor C++14 e introduce nuevas características de lenguaje y biblioteca. El estándar fue publicado en diciembre de 2017.

Las siguientes características se fusionaron en C++17:

Contenidos

Características obsoletas

Características eliminadas
Características obsoletas

Nuevas características del lenguaje

Nuevos encabezados

Nuevas características de la biblioteca

Tipos de utilidad

Gestión de memoria

Programación en tiempo de compilación

Algoritmos

Iteradores y contenedores

Números

Otros

Informes de defectos

Informes de Defectos corregidos en C++17 (290 núcleo, 363 biblioteca)

Soporte del compilador

Características principales del lenguaje C++17

Característica de C++17

Documento(s)

GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray
Embarcadero C++ Builder
IBM Open XL C++ for AIX
DR11: Nuevas auto reglas para la inicialización directa de lista N3922 5 3.8 19.0 (2015)* 4.10.1 17.0 17.7 11.0 11.0 10.3 17.1.0
typename en un parámetro de plantilla de plantilla N4051 5 3.5 19.0 (2015)* 4.10.1 17.0 17.7 Sí* 11.0 10.3 17.1.0
Eliminación de trigraphs N4086 5 3.5 16.0* 5.0 19.1 11.0 11.0 10.3 17.1.0
Definición de espacio de nombres anidado N4230 6 3.6 19.0 (Update 3)* 4.12 17.0 17.7 11.0 11.0 10.3 17.1.0
static_assert sin mensaje  ( FTM ) * N3928 6 2.5 19.10* 4.12 18.0 17.7 11.0 11.0 10.3 17.1.0
Atributos para espacios de nombres y enumeradores  ( FTM ) * ( FTM ) * N4266 4.9 (parcial)*
6
3.6 19.0 (2015)* 4.11 17.0 17.7 11.0 11.0 10.3 17.1.0
u8 literales de carácter N4267 6 3.6 19.0 (2015)* 4.11 17.0 17.7 11.0 11.0 10.3 17.1.0
Permitir evaluación constante para todos los argumentos de plantilla constantes  ( FTM ) * N4268 6 3.6 19.12* 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Expresiones de plegado unario y paquetes de parámetros vacíos P0036R0 6 3.9 19.12* 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0
Eliminar el uso obsoleto de la palabra clave register P0001R1 7 3.8 19.11* 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
Eliminar el obsoleto operator ++ ( bool ) P0002R1 7 3.8 19.11* 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
Hacer que las especificaciones de excepción sean parte del sistema de tipos  ( FTM ) * P0012R1 7 4 19.12* 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0
__has_include en condicionales del preprocesador P0061R1 5 19.11* 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
DR11: Nueva especificación para constructores heredados ( DR1941 et al)  ( FTM ) * P0136R1 7 3.9 19.14* * 6.1 19.1 11.0 11.0 10.3 17.1.0
Clases agregadas con clases base  ( FTM ) * P0017R1 7 3.9 19.14* 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Expresiones de Plegado ( FTM ) * N4295 6 3.6 19.12* 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
Captura lambda de * this ( FTM ) * P0018R3 7 3.9 19.11* 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
Inicialización directa por lista de enumeraciones P0138R2 7 3.9 19.11* 4.14 18.0 19.1 11.0 11.0 10.3 17.1.0
constexpr expresiones lambda ( FTM ) * P0170R1 7 5 19.11* 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
Tipos diferentes de begin y end en range-based for ( FTM ) * P0184R0 6 3.9 19.10* 4.12 18.0 17.7 11.0 11.0 10.3 17.1.0
[[ fallthrough ]] atributo P0188R1 7 3.9 19.10* 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
[[ nodiscard ]] atributo P0189R1 7 3.9 19.11* 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
[[ maybe_unused ]] atributo P0212R1 7 3.9 19.11* 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
Literales hexadecimales de punto flotante ( FTM ) * P0245R1 3.0 19.11* 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
Uso de espacios de nombres de atributos sin repetición P0028R4 7 3.9 19.11* 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
Asignación de memoria dinámica para datos sobrealineados  ( FTM ) * P0035R4 7 4 19.12* 10.0.0* 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0
Parámetros de plantilla constantes con tipo auto ( FTM ) * P0127R2 7 4 19.14* 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Eliminación de copia garantizada ( FTM ) * P0135R1 7 4 19.13* 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Reemplazo de objetos de clase que contienen miembros de referencia P0137R1 7 6 19.14* 5.0 19.1 11.0 11.0 10.3 17.1.0
Evaluación de expresiones más estricta expression evaluation order P0145R3 7 4 19.14* 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Enlaces Estructurados ( FTM ) * P0217R3 7 4 19.11* 4.14 19.0 18.1 11.0* 11.0 10.3 17.1.0
Ignorar atributos desconocidos P0283R2 3.9 19.0 (2015)* 4.13 18.0 17.7 11.0 11.0 10.3 17.1.0
sentencias constexpr if ( FTM ) * P0292R2 7 3.9 19.11* 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
Sentencias de inicialización para if y switch P0305R1 7 3.9 19.11* 4.14 18.0 18.1 11.0 11.0 10.3 17.1.0
Variables en línea ( FTM ) * P0386R2 7 3.9 19.12* 4.14 19.0 18.1 11.0 11.0 10.3 17.1.0
Eliminación de especificaciones de excepciones dinámicas P0003R5 7 4 19.12* 4.14 19.0 19.1 11.0 11.0 10.3 17.1.0
Expansiones de paquetes en declaraciones using  ( FTM ) * P0195R2 7 4 19.14* 5.0 19.0 19.1 11.0 11.0 10.3 17.1.0
DR98: La coincidencia de argumentos de plantilla de plantilla excluye plantillas compatibles  ( FTM ) * P0522R0 7 4 19.12* 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0
Deducción de argumentos de plantilla de clase ( FTM ) * P0091R3 7 5 19.14* 5.0 19.0.1 19.1 11.0 11.0 10.3 17.1.0


Característica de C++17


Documento(s)
GCC
Clang
MSVC
Apple Clang
EDG eccp
Intel C++
Nvidia HPC C++ (ex PGI)*
Nvidia nvcc
Cray
Embarcadero C++ Builder
IBM Open XL C++ for AIX

Características de la biblioteca C++17

**Cambios realizados:** - Traducido "Feature-testing macro" a "Macro de prueba de características" - Traducido "Yes" a "Sí" - Se mantuvieron todos los términos técnicos de C++ (`std::scoped_lock`, `__cpp_lib_scoped_lock`, etc.) - Se preservaron todas las etiquetas HTML y atributos - No se tradujo el contenido dentro de las etiquetas ` ` - Se mantuvo el formato original y la estructura HTML **Nota:** En este caso, el único texto que requería traducción era "DR17" (que se mantiene igual como acrónimo técnico) y "N/A" (No Aplicable), pero dado que son términos técnicos estándar en documentación de programación, se han conservado en su forma original según las instrucciones proporcionadas.
Característica de C++17

Documento(s)

GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
IBM Open XL C/C++ for AIX*
Intel Parallel STL
Embarcadero C++ Builder*
std::void_t ( FTM ) * N3911 6.1 3.6 19.0 (2015)* 17.1.0 N/A 10.3
std::uncaught_exceptions() ( FTM ) * N4259 6.1 3.7 19.0 (2015)* 17.1.0 N/A 10.3
std::size() , std::empty() y std::data() ( FTM ) * N4280 6 3.6 19.0 (2015)* 17.1.0 N/A 10.3
std::allocator_traits::is_always_equal , noexcept limpiezas  ( FTM ) * N4258 6.1 3.7 19.0 (2015)* 17.1.0 N/A
std::invoke ( FTM ) * N4169 6.1 3.7 19.0 (2015)* 17.1.0 N/A
std::map::try_emplace , std::map::insert_or_assign ( FTM ) * N4279 6.1 3.7 19.0 (2015)* 17.1.0 N/A
std::unordered_map::try_emplace , std::unordered_map::insert_or_assign ( FTM ) * N4279 6.1 3.7 19.0 (2015)* 17.1.0 N/A
Mejorando std::pair y std::tuple N4387 6.1 4 19.0 (Update 2)* 17.1.0 N/A 10.3
std::bool_constant ( FTM ) * N4389 6.1 3.7 19.0 (2015)* 17.1.0 N/A 10.3
std::shared_mutex (sin temporización)  ( FTM ) * N4508 6 3.7 19.0 (Update 2)* 17.1.0 N/A 10.3
Soporte mínimo para tipos incompletos en std::forward_list , std::list , y std::vector ( FTM ) * N4510 3.0 3.6 18.0* 17.1.0 N/A
Plantillas de variables de rasgos de tipo ( FTM ) * P0006R0 7.1 3.8 19.0 (Update 2)* 17.1.0 N/A 10.3
Rasgos de tipo de operador lógico ( FTM ) * P0013R1 6.1 3.8 19.0 (Update 2)* 17.1.0 N/A 10.3
std::as_const ( FTM ) * P0007R1 7.1 3.8 19.0 (Update 2)* 17.1.0 N/A
Funciones de redondeo para std::chrono::duration y std::chrono::time_point ( FTM ) * P0092R1 7.1 3.8 19.0 (Update 2)* 17.1.0 N/A
Operadores transparentes std::owner_less ( std::owner_less<void> )  ( FTM ) * P0074R0 7.1 3.8 19.0 (Update 2)* 17.1.0 N/A
std::not_fn ( FTM ) * P0005R4
P0358R1
7.1 3.9 19.12* 17.1.0 N/A 10.3
Algoritmos paralelos y políticas de ejecución ( FTM ) * ( FTM ) * P0024R2 9* 17
(parcial)*
19.14* 18.0*
std::clamp() ( FTM ) * P0025R1 7 3.9 19.0 (Actualización 3)* 10.0.0* 17.1.0 N/A 10.3
Rasgos (nothrow-)swappable ( FTM ) * P0185R1 7.1* 3.9 19.0 (Update 3)* 10.0.0* 17.1.0 N/A 10.3
Recursos de memoria polimórficos ( FTM ) * P0220R1 9.1 16 19.13* 15.0.0* 17.1.1 N/A 10.3
std::apply ( FTM ) * P0220R1 7.1 16 19.13* 17.1.0 N/A
Buscadores ( FTM ) * P0220R1 7.1 16 19.13* 17.1.0 N/A
std::sample ( FTM ) * P0220R1 7.1 16 19.13* 17.1.0 N/A
Funciones matemáticas especiales ( FTM ) * P0226R1 7 19.14* 17.1.1 N/A 10.3
constexpr std::addressof ( FTM ) * LWG2296 7.1 19.0 (Update 3)* 17.1.0 N/A
constexpr para std::reverse_iterator , std::move_iterator , std::array y acceso a rangos ( FTM ) * P0031R0 7.1 4 19.11* 17.1.0 N/A
constexpr std:: atomic < T > :: is_always_lock_free ( Macro de prueba de características ) * P0152R1 7.1 3.9 19.11* 17.1.0 N/A
std::enable_shared_from_this::weak_from_this ( FTM ) * P0033R1 7.1 3.9 19.12* 17.1.0 N/A
Sobrecarga de 3 argumentos de std::hypot ( FTM ) * P0030R1 7.1 3.9 19.14* 17.1.0 N/A
std::byte ( FTM ) * P0298R3 7 5 19.11* 17.1.1 N/A 10.3
std::string_view ( FTM ) * N3921
P0220R1
P0254R2
P0403R1
7.1 4 19.10* (parcial)*
19.11* *
10.0.0* 17.1.0 N/A 10.3
std::any ( FTM ) * P0220R1
P0032R3
7.1 4 19.10* 10.0.0* 17.1.0 N/A 10.3
std::optional ( FTM ) * P0220R1 7.1 4 19.10* 10.0.0* 17.1.0 N/A 10.3
Porción principal de la biblioteca estándar C11 P0063R3 9.1 7 19.0 (2015)*
(parcial)*
10.0.0* 17.1.1 N/A
Empalme de Maps y Sets ( FTM ) * P0083R3 7 8 19.12* 10.0.0* 17.1.1 N/A
tipo de retorno de las funciones emplace * de algunos contenedores cambió de void a referencia P0084R2 7.1 4.0 19.11* 17.1.0 N/A
std::variant ( FTM ) * P0088R3 7.1 4 19.10* 10.0.0* 17.1.0 N/A 10.3
std::make_from_tuple() ( FTM ) * P0209R2 7.1 3.9 19.10* 17.1.0 N/A 10.3
std::has_unique_object_representations ( FTM ) * P0258R2 7.1 6 19.11* 17.1.1 N/A 10.3
std::gcd() y std::lcm() ( FTM ) * P0295R0 7 4 19.11* 17.1.0 N/A 10.3
CWG issue 1776 : Reemplazo de objetos de clase que contienen miembros de referencia ( std::launder )  ( FTM ) * P0137R1 7.1 6 19.14* 17.1.0 N/A
Extensión de herramientas de gestión de memoria ( FTM ) * P0040R3 7.1 4 19.11* 17.1.0 N/A
shared_ptr::weak_type ( FTM ) * P0163R0 7.1 3.9 19.10* 17.1.0 N/A
Conversiones elementales de cadenas : std:: to_chars / std:: from_chars ( FTM ) * P0067R5 8*
11
7*
14*
20*
19.14* *
19.24*
10.0.0* * 17.1.1* N/A 10.3*
std::shared_ptr y std::weak_ptr con soporte para arrays P0414R2 7 11 19.12* 12.0.0* 17.1.1 N/A 10.3
Constexpr para todas las funciones miembro de std::chrono::duration y std::chrono::time_point ( FTM ) * P0505R0 7.1 4 19.11* 17.1.1 N/A
std:: shared_ptr < T [ ] > ( FTM ) * P0497R0 7.1 11 19.12* 17.1.1 N/A
constexpr std::char_traits ( FTM ) * P0426R1 8.1 4 19.14* 17.1.1 N/A
Biblioteca del sistema de archivos ( std::filesystem )  ( FTM ) * P0218R1
P0219R1
8 7 19.14* 11.0.0* 17.1.1 N/A 10.3
Tamaño de interferencia de hardware ( FTM ) * P0154R1 12.1 15 (parcial)*
19
19.11* N/A 10.3
std::scoped_lock ( FTM ) * P0156R2 7 5 19.11* 17.1.1 N/A 10.3
std::is_aggregate ( FTM ) * LWG2911 7 5 19.15* 17.1.1 N/A 10.3
std::is_invocable , std::invoke_result ( FTM ) * P0604R0 7.1 19.11* 17.1.1 N/A
DR17: std::hash<std::filesystem::path> LWG3657 11.4 17 19.32* N/A


Característica de C++17


Documento(s)
GCC libstdc++
Clang libc++
MSVC STL
Apple Clang*
IBM Open XL C/C++ for AIX*
Intel Parallel STL
Embarcadero C++ Builder*
Notas
  • A partir del 20 de noviembre de 2020, la última versión de Oracle Developer Studio es la 12.6 . Su documentación no menciona C++17.
  • El compilador Cray puede tener soporte para algunas características antes de la versión 11.0. Esa versión es cuando se convirtió en un derivado de Clang, obteniendo todo el soporte de características del lenguaje del compilador base. Consulte el documento Cray/HPE S-2179 .

* - pase el cursor sobre una celda marcada con el asterisco * para ver notas emergentes adicionales.
DR nn - el número nn después de "DR" denota la revisión de C++ objetivo a la que se aplica el Informe de Defectos, por ejemplo, DR20 → C++20.

Enlaces externos

1. C++17 - Wikipedia
2. Ejemplos funcionales de C++17