Características del lenguaje:
Plantillas y Código Genérico
Lambda
Atributos
Limpieza de sintaxis
Limpiador de retorno múltiple y control de flujo
Misceláneos
Literales de coma flotante hexadecimal
Asignación de memoria dinámica para datos sobrealineados
Copia garantizada de elisión
- ¡Finalmente!
- No en todos los casos, pero distingue la sintaxis en la que "solo está creando algo" que se llamó elisión, de "elisión genuina".
Se corrigió el orden de evaluación para (algunas) expresiones con algunas modificaciones
- Sin incluir argumentos de función, pero la intercalación de evaluación de argumentos de función ahora está prohibida
- Hace que un montón de código roto funcione principalmente, y hace que
.then
el trabajo futuro.
Inicialización directa de listas de enumeraciones
Garantías de avance (FPG) (también, FPG para algoritmos paralelos )
- ¿Creo que esto dice "la implementación puede no detener los hilos para siempre"?
u8'U', u8'T', u8'F', u8'8'
literales de caracteres (la cadena ya existía)
"noexcept" en el sistema de tipos
__has_include
- Probar si un archivo de encabezado incluir sería un error
- hace que la migración de experimental a estándar sea casi perfecta
Arreglos de arreglos de conversión de punteros
Los constructores heredados corrigen algunos casos de esquina (ver P0136R0 para ejemplos de cambios de comportamiento)
inicialización agregada con herencia .
std::launder
, escriba punking, etc.
Adiciones a la biblioteca:
Tipos de datos
Invocar cosas
std::invoke
- Llame a cualquier invocable (puntero de función, función, puntero de miembro) con una sintaxis. Del concepto INVOKE estándar.
std::apply
- Toma una función y una tupla, y desempaqueta la tupla en la llamada.
std::make_from_tuple
, std::apply
aplicado a la construcción de objetos
is_invocable
` is_invocable_r
`invoke_result
Enhebrar
Mejoras de contenedores
Cambios de puntero inteligente
Otras std
mejoras de tipo de datos:
Misceláneos
La biblioteca C ++ 17 se basa en C11 en lugar de C99
Reservado std[0-9]+
para futuras bibliotecas estándar
destroy(_at|_n)
, uninitialized_move(_n)
, uninitialized_value_construct(_n)
,uninitialized_default_construct(_n)
- código de utilidad ya en la mayoría de las
std
implementaciones expuestas
- Funciones especiales de matemática
- a los científicos les pueden gustar
std::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
aproximadamente
gcd
y lcm
std::uncaught_exceptions
- Requerido si solo desea lanzar si está a salvo de los destructores
std::as_const
std::bool_constant
- Un montón de
_v
variables de plantilla
std::void_t<T>
- Sorprendentemente útil al escribir plantillas
std::owner_less<void>
- me gusta
std::less<void>
, pero para que los punteros inteligentes los ordenen en función de los contenidos
std::chrono
polaco
std::conjunction
, std::disjunction
,std::negation
Expuesta
std::not_fn
- Reglas para noexcept dentro de
std
- std :: is_contiguous_layout , útil para el hash eficiente
- std :: to_chars / std :: from_chars , alto rendimiento, conversión de números agnósticos locales; finalmente una forma de serializar / deserializar a formatos legibles por humanos (JSON & co)
std :: default_order , indirection over std::less
. ( rompe el ABI de algunos compiladores debido a la eliminación del nombre, eliminado).
Rasgos
Obsoleto
Isocpp.org tiene una lista independiente de cambios desde C ++ 14; ha sido parcialmente saqueado.
Naturalmente, el trabajo de TS continúa en paralelo, por lo que hay algunos TS que aún no están maduros y tendrán que esperar la próxima iteración. El objetivo para la próxima iteración es C ++ 20 como se planificó previamente, no C ++ 19 como algunos rumores implican. Se ha evitado C ++ 1O.
Lista inicial tomada de esta publicación de reddit y esta publicación de reddit , con enlaces agregados a través de google o desde la página isocpp.org anterior.
Entradas adicionales saqueadas de la lista de pruebas de características SD-6 .
lista de características de sonido metálico y la lista de funciones de la biblioteca están al lado de ser saqueado. Esto no parece ser confiable, ya que es C ++ 1z, no C ++ 17.
Estas diapositivas tenían algunas características que faltaban en otros lugares.
Si bien no se preguntó "qué se eliminó", aquí hay una breve lista de algunas cosas (¿en su mayoría? Obsoletas anteriormente) que se eliminan en C ++ 17 de C ++:
Remoto:
Hubo reformulaciones. No estoy seguro si estos tienen algún impacto en el código, o si son solo limpiezas en el estándar:
Documentos aún no integrados en lo anterior:
P0505R0 (constexpr chrono)
P0418R2 (ajustes atómicos)
P0512R0 (ajustes de deducción de argumentos de plantilla)
P0490R0 (ajustes de enlace estructurado)
P0513R0 (cambia a std::hash
)
P0502R0 (excepciones paralelas)
P0509R1 (actualización de restricciones en el manejo de excepciones)
P0012R1 (hacer que las especificaciones de excepción sean parte del sistema de tipos)
P0510R0 (restricciones en variantes)
P0504R0 (etiquetas para opcional / variante / cualquiera)
P0497R0 (ajustes de ptr compartidos)
P0508R0 (manejadores de nodo de enlaces estructurados)
P0521R0 (¿cuenta de uso de puntero compartido y cambios únicos?)
Cambios de especificaciones:
Referencia adicional: