Namespaces
Variants

C++17

De es.cppreference.net
< cpp

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

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

Características obsoletas

Características eliminadas
Características en desuso
  • std::iterator,
  • std::raw_storage_iterator,
  • std::get_temporary_buffer,
  • std::is_literal_type,
  • std::result_of,
  • todo <codecvt>

Nuevas características de lenguaje

Nuevos encabezados

Nuevas características de la biblioteca

Tipos de utilidad

Gestión de memoria

  • algoritmos de memoria no inicializada
    • std::destroy_at
    • std::destroy
    • std::destroy_n
    • std::uninitialized_move
    • std::uninitialized_value_construct
  • weak_from_this
  • std::pmr::memory_resource y std::polymorphic_allocator
  • std::aligned_alloc
  • std::owner_less
  • transparente soporte de arreglos para std::shared_ptr
  • funciones de asignación con alineación explícita

Programación en tiempo de compilación

Algoritmos

  • std::clamp
  • algoritmos paralelos y políticas de ejecución
  • std::inclusive_scan
  • std::exclusive_scan
  • std::gcd
  • std::lcm
  • std::reduce

Iteradores y contenedores

Numérica

3D

std::chrono::time_point

Informes de defectos

Soporte del compilador

Características del lenguaje central de C++17

Característica de C++17

 
Propuesta(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 reglas de auto para la inicialización directa de listas N3922 5 3.8 19.0 (2015)* Sí 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)* Sí 4.10.1 17.0 17.7 Sí* 11.0  10.3 17.1.0
Eliminación de trígrafos N4086 5 3.5 16.0* Sí 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)* Sí 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* Sí 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)* Sí 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)* Sí 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 constante  (FTM)* N4268 6 3.6 19.12* Sí 5.0 19.0.1 19.1 11.0 11.0  10.3 17.1.0
Expresiones fold unarias y paquetes de parámetros vacíos P0036R0 6 3.9 19.12* Sí 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* Sí 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* Sí 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* Sí 4.14 19.0 19.1 11.0 11.0  10.3 17.1.0
__has_include en condicionales de preprocesador P0061R1 5 Sí 19.11* Sí 4.13 18.0 17.7 11.0 11.0  10.3 17.1.0
DR11: Nueva especificación para constructores heredados (DR1941 y otros)  (FTM)* P0136R1 7 3.9 19.14** Sí 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* Sí 5.0 19.0.1 19.1 11.0 11.0  10.3 17.1.0
Expresiones Fold  (FTM)* N4295 6 3.6 19.12* Sí 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* Sí 4.14 19.0 18.1 11.0 11.0  10.3 17.1.0
Inicialización directa de listas de enumeraciones P0138R2 7 3.9 19.11* Sí 4.14 18.0 19.1 11.0 11.0  10.3 17.1.0
constexpr expresiones lambda  (FTM)* P0170R1 7 5 19.11* Sí 4.14 19.0 18.1 11.0 11.0  10.3 17.1.0
Tipos de inicio y fin diferentes en range-based for  (FTM)* P0184R0 6 3.9 19.10* Sí 4.12 18.0 17.7 11.0 11.0  10.3 17.1.0
[[fallthrough]] atributo P0188R1 7 3.9 19.10* Sí 4.13 18.0 17.7 11.0 11.0  10.3 17.1.0
[[nodiscard]] atributo P0189R1 7 3.9 19.11* Sí 4.13 18.0 17.7 11.0 11.0  10.3 17.1.0
[[maybe_unused]] atributo P0212R1 7 3.9 19.11* Sí 4.13 18.0 17.7 11.0 11.0  10.3 17.1.0
Literales de punto flotante hexadecimal  (FTM)* P0245R1 3.0 Sí 19.11* Sí 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* Sí 4.13 18.0 17.7 11.0 11.0  10.3 17.1.0
Asignación dinámica de memoria 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 autotipo  (FTM)* P0127R2 7 4 19.14* Sí 5.0 19.0.1 19.1 11.0 11.0  10.3 17.1.0
Elisión de copia garantizada ( FTM)*P0135R1 7 4 19.13* Sí 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* Sí 5.0 19.1 11.0 11.0 10.3   17.1.0 Orden de
evaluación de expresiones más estrictoP0145R3 7 4 19.14* Sí 5.0 19.0.1 19.1 11.0 11.0 10.3   17.1.0 Vinculaciones estructuradas
( FTM)*P0217R3 7 4 19.11* Sí 4.14 19.0 18.1 11.0* 11.0 10.3   17.1.0 Ignorar
atributos desconocidos P0283R2 Sí 3.9 19.0 (2015)* Sí 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* Sí 4.14 19.0 18.1 11.0 11.0  10.3 17.1.0
Sentencias de inicio para if y switch P0305R1 7 3.9 19.11* Sí 4.14 18.0 18.1 11.0 11.0  10.3 17.1.0
Variables inline  (FTM)* P0386R2 7 3.9 19.12* Sí 4.14 19.0 18.1 11.0 11.0  10.3 17.1.0
Eliminación de especificaciones de excepción dinámicas P0003R5 7 4 19.12* Sí 4.14 19.0 19.1 11.0 11.0  10.3 17.1.0
Expansiones de paquetes en using-declarations  (FTM)* P0195R2 7 4 19.14* Sí 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* Sí 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* Sí 5.0 19.0.1 19.1 11.0 11.0  10.3 17.1.0
 

Característica de C++17
 

Propuesta(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 de C++17

Característica de C++17

 
Propuesta(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)* Sí  17.1.0 N/A 10.3
std::uncaught_exceptions()  (FTM)* N4259 6.1 3.7 19.0 (2015)* Sí  17.1.0 N/A 10.3
std::size(), std::empty() y std::data()  (FTM)* N4280 6 3.6 19.0 (2015)* Sí  17.1.0 N/A 10.3
std::allocator_traits::is_always_equal, noexceptlimpiezas de   (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)* Sí  17.1.0 N/A
std::map::try_emplace, std::map::insert_or_assign  (FTM)* N4279 6.1 3.7 19.0 (2015)* Sí  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)* Sí  17.1.0 N/A
Mejora de std::pair y std::tuple N4387 6.1 4 19.0 (Update 2)* Sí  17.1.0 N/A 10.3
std::bool_constant  (FTM)* N4389 6.1 3.7 19.0 (2015)* Sí  17.1.0 N/A 10.3
std::shared_mutex (sin temporización)  (FTM)* N4508 6 3.7 19.0 (Update 2)* Sí  17.1.0 N/A 10.3
Soporte mínimo de tipos incompletos para std::forward_list, std::list y std::vector  (FTM)* N4510 3.0 3.6 18.0* Sí  17.1.0 N/A
Plantillas de variable de rasgos de tipo  (FTM)* P0006R0 7.1 3.8 19.0 (Update 2)* Sí  17.1.0 N/A 10.3
Rasgos de tipo de operador lógico  (FTM)* P0013R1 6.1 3.8 19.0 (Update 2)* Sí  17.1.0 N/A 10.3
std::as_const  (FTM)* P0007R1 7.1 3.8 19.0 (Update 2)* Sí  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)* Sí  17.1.0 N/A
Transparente std::owner_less (std::owner_less<void>)  (FTM)* P0074R0 7.1 3.8 19.0 (Update 2)* Sí  17.1.0 N/A
std::not_fn  (FTM)* P0005R4
P0358R1
7.1 3.9 19.12* Sí  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 (Update 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* Sí  17.1.0 N/A
Buscadores  (FTM)* P0220R1 7.1 16 19.13* Sí  17.1.0 N/A
std::sample  (FTM)* P0220R1 7.1 16 19.13* Sí  17.1.0 N/A
Funciones especiales matemáticas  (FTM)* P0226R1 7 19.14*   17.1.1 N/A 10.3
constexpr std::addressof  (FTM)* LWG2296 7.1 Sí 19.0 (Update 3)*   17.1.0 N/A
constexpr para std::reverse_iterator, std::move_iterator, std::array y acceso por rango  (FTM)* P0031R0 7.1 4 19.11* Sí  17.1.0 N/A
constexpr std::atomic<T>::is_always_lock_free  (FTM)* P0152R1 7.1 3.9 19.11* Sí  17.1.0 N/A
std::enable_shared_from_this::weak_from_this  (FTM)* P0033R1 7.1 3.9 19.12* Sí  17.1.0 N/A
Sobrecarga de 3 argumentos de std::hypot  (FTM)* P0030R1 7.1 3.9 19.14* Sí  17.1.0 N/A
std::byte  (FTM)* P0298R3 7 5 19.11* Sí  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
Parte principal de la biblioteca estándar de C11 P0063R3 9.1 7 19.0 (2015)*
(parcial)*
10.0.0*  17.1.1 N/A
Empalme Mapas y Conjuntos  (FTM)* P0083R3 7 8 19.12* 10.0.0*  17.1.1 N/A
tipo de retorno de funciones emplace* de algunos contenedores cambiado de void a referencia P0084R2 7.1 4.0 19.11* Sí  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* Sí  17.1.0 N/A 10.3
std::has_unique_object_representations  (FTM)* P0258R2 7.1 6 19.11* Sí  17.1.1 N/A 10.3
std::gcd() y std::lcm()  (FTM)* P0295R0 7 4 19.11* Sí  17.1.0 N/A 10.3
Problema CWG 1776: Reemplazo de objetos de clase que contienen miembros de referencia (std::launder)  (FTM)* P0137R1 7.1 6 19.14* Sí  17.1.0 N/A
Extensión de herramientas de gestión de memoria  (FTM)* P0040R3 7.1 4 (parcial)* 19.11*   17.1.0 N/A
shared_ptr::weak_type  (FTM)* P0163R0 7.1 3.9 19.10* Sí  17.1.0 N/A
Conversiones de cadenas elementales: 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 de arreglos 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* Sí  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* Sí  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* Sí  17.1.1 N/A 10.3
std::is_aggregate  (FTM)* LWG2911 7 5 19.15* Sí  17.1.1 N/A 10.3
std::is_invocable, std::invoke_result  (FTM)* P0604R0 7.1 Sí 19.11* Sí  17.1.1 N/A
DR17: std::hash<std::filesystem::path> LWG3657 11.4 17 19.32*   N/A
 

Característica de C++17
 

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

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

Enlaces externos

1.  C++17 - Wikipedia
2.  Ejemplos prácticos de C++17