Compiler support for C++17
From cppreference.net
<
cpp
|
compiler support
*
- 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.
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 direct-list-initialization | 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 en 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 garantizada de copia copy elision ( 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 attributes | 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 | ||
| 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 (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 (Actualización 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 ( 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 | |
| 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 [ ] > ( MFP ) * | 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 anterior a la versión 11.0. Esa versión es cuando se convirtió en un derivado de Clang, adquiriendo todo el soporte de características del lenguaje del compilador base. Consulte el documento Cray/HPE S-2179 .