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:
- Del TS del sistema de archivos: la biblioteca del sistema de archivos.
- Del TS de fundamentos de biblioteca v1: características, incluyendo std::any, std::optional, std::string_view, std::apply, asignadores polimórficos, buscadores.
- Del TS de fundamentos de biblioteca v2: std::void_t, std::conjunction, std::disjunction, std::negation, std::not_fn, std::gcd, std::lcm.
- Del TS de paralelismo v1: características, incluyendo políticas de ejecución, std::reduce, std::inclusive_scan, std::exclusive_scan, pero eliminando
exception_list. - Del IS de funciones especiales matemáticas: funciones especiales matemáticas.
- De C11: std::aligned_alloc, std::timespec_get.
| Esta sección está incompleta |
Características obsoletas
Características eliminadas
- std::auto_ptr,
- objetos función en desuso,
- std::random_shuffle,
- std::unexpected,
- los alias
iostreamobsoletos de , - trígrafos,
- la palabra clave register,
boolincremento,- especificación de excepción dinámica
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
u8literal de carácter- se hizo noexcept parte del sistema de tipos
- nuevas reglas de orden de evaluación
- captura lambda de
*this
- constexpr
- en tiempo de compilación if constexpr
- lambda constexpr
- Variables
- variables inline
- vinculaciones estructuradas
- inicializadores para if y switch
- elisión de copia
- garantizada materialización temporal
- Plantillas
- expresiones fold
( ... ) - deducción de argumentos de plantilla de clase
tuple t(4, 3, 2.5) - parámetros de plantilla no tipo declarados con
auto
- expresiones fold
- Espacios de nombres
- espacios de nombres anidados simplificados
usingdeclaración que declara múltiples nombres- espacios de nombres de atributos no tienen que repetirse
- nuevos atributos:
[[fallthrough]][[maybe_unused]][[nodiscard]]
- __has_include
Nuevos encabezados
Nuevas características de la biblioteca
Tipos de utilidad
- std::tuple:
- std::apply
- std::make_from_tuple
- guías de deducción
- std::any
- std::optional
- std::variant
- buscadores
- std::as_const
- std::not_fn
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
- std::byte
- std::conjunction/std::disjunction/std::negation
- plantillas de variable de rasgo de tipo (
xxx_+v) - std::is_swappable
- std::is_invocable
- std::is_aggregate
- std::has_unique_object_representations
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
- extraer de mapa/conjunto y fusionar de mapa/conjuntotry_emplace
- de mapa/unordered_map e insert_or_assigniteradores contiguos (
- LegacyContiguousIterator)no miembro
- std::size/std::empty/std::data
Numérica
- funciones especiales matemáticas
- std::hypot
3D
- Otros
- interfaz de línea de caché
- std::launder
- std::uncaught_exceptionsstd::to_chars/
- std::from_chars<std::atomic>T
- ::is_always_lock_free
- std::scoped_lock
- std::timespec_getfunciones de redondeo para std::chrono::duration y
std::chrono::time_point
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 |