C++17
From cppreference.net
<
cpp
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:
- Del File System TS : la biblioteca del sistema de archivos .
- Del Library fundamentals v1 TS : características, incluyendo std::any , std::optional , std::string_view , std::apply , asignadores polimórficos , buscadores .
- Del Library fundamentals v2 TS : std::void_t , std::conjunction , std::disjunction , std::negation , std::not_fn , std::gcd , std::lcm .
-
Del
Parallelism v1 TS
: características, incluyendo
políticas de ejecución
,
std::reduce
,
std::inclusive_scan
,
std::exclusive_scan
, pero eliminando
exception_list. - Del Mathematical special functions IS : funciones matemáticas especiales .
- De C11: std::aligned_alloc , std::timespec_get .
| Esta sección está incompleta |
Contenidos |
Características obsoletas
Características eliminadas
- std::auto_ptr ,
- objetos de función obsoletos ,
- std::random_shuffle ,
- std::unexpected ,
-
los
alias obsoletos de
iostream, - trigraphs ,
- la palabra clave register ,
-
boolincrement , - especificación de excepción dinámica
Características obsoletas
- std::iterator ,
- std::raw_storage_iterator ,
- std::get_temporary_buffer ,
- std::is_literal_type ,
- std::result_of ,
- todos los elementos de <codecvt>
Nuevas características del lenguaje
-
u8literal de carácter - hecho noexcept parte del sistema de tipos
- nuevas reglas de orden de evaluación
- captura lambda de * this
-
constexpr
- evaluación en tiempo de compilación if constexpr
- constexpr lambda
-
Variables
- variables inline
- enlaces estructurados
- inicializadores para if y switch
- garantía de eliminación de copia
- materialización temporal
-
Plantillas
- expresiones de plegado ( ... )
- deducción de argumentos de plantilla de clase tuple t ( 4 , 3 , 2.5 )
-
parámetros de plantilla
constantes
declarados con
auto
-
Espacios de nombres
- espacios de nombres anidados simplificados
-
using-declaración que declara múltiples nombres - espacios de nombres de atributos no necesitan repetirse
-
nuevos
atributos
:
-
[[ fallthrough ]] -
[[ maybe_unused ]] -
[[ nodiscard ]]
-
- __has_include
Nuevos encabezados
Nuevas características de la biblioteca
Tipos de utilidad
Gestión de memoria
- algoritmos de memoria no inicializada
- weak_from_this
- std::pmr::memory_resource y std::polymorphic_allocator
- std::aligned_alloc
- transparente std::owner_less
- soporte para arrays de 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 variables de rasgos 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
- map/set extract y map/set merge
- map/unordered_map try_emplace y insert_or_assign
- iteradores contiguos ( LegacyContiguousIterator )
- funciones no miembro std::size / std::empty / std::data
Números
Otros
- interfaz de línea de caché
- std::launder
- std::uncaught_exceptions
- std::to_chars / std::from_chars
- std::atomic<T>::is_always_lock_free
- std::scoped_lock
- std::timespec_get
- funciones de redondeo para std::chrono::duration y std::chrono::time_point
Informes de defectos
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)* | 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 trigraphs | 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 constantes ( 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 de plegado unario 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 del 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 et al) ( 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 de Plegado ( 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 por lista 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 diferentes de begin y end 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 hexadecimales de punto flotante ( 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 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* | Sí | 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* | 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 | ||
| Evaluación de expresiones más estricta expression evaluation order | P0145R3 | 7 | 4 | 19.14* | Sí | 5.0 | 19.0.1 | 19.1 | 11.0 | 11.0 | 10.3 | 17.1.0 | |
| Enlaces Estructurados ( 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 inicialización 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 en línea ( 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 excepciones 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 declaraciones using ( 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 |
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
|
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)* | 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 , 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)* | 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 | ||
| Mejorando 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 para tipos incompletos en std::forward_list , std::list , y std::vector ( FTM ) * | N4510 | 3.0 | 3.6 | 18.0* | Sí | 17.1.0 | N/A | ||
| Plantillas de variables 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 | ||
| Operadores transparentes 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 (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* | 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 matemáticas especiales ( 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 a rangos ( FTM ) * | P0031R0 | 7.1 | 4 | 19.11* | Sí | 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* | 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 | |
| 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* | 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 | |
| CWG issue 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 | 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 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* | 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 |
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 |