¿Cuáles son las nuevas características de C++17?
C++17 ahora tiene todas las funciones, por lo que es poco probable que experimente grandes cambios. Se presentaron cientos de propuestas para C++17.
¿Cuáles de esas características se agregaron a C++ en C++17?
Cuando se utiliza un compilador de C++ que admite "C++1z", ¿cuáles de esas características estarán disponibles cuando el compilador se actualice a C++17?
Características del idioma:
Plantillas y código genérico
Deducción de argumentos de plantilla para plantillas de clase
- Al igual que las funciones deducen los argumentos de la plantilla, ahora los constructores pueden deducir los argumentos de la plantilla de la clase.
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
template <auto>
- Representa un valor de cualquier tipo (argumento de plantilla que no sea de tipo).
Correcciones de argumentos de plantilla que no son de tipo
template<template<class...>typename bob> struct foo {}
( Plegado +... + expresiones ) y Revisiones
auto x{8};
es unint
modernizando
using
con...
y listas
lambda
lambdas constexpr
- Las lambdas son implícitamente consistentes si califican.
Capturando
*this
en lambdas[*this]{ std::cout << could << " be " << useful << '\n'; }
Atributos
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
atributos[[attributes]]
ennamespace
s yenum { erator[[s]] }
using
en atributos para evitar tener que repetir un espacio de nombres de atributo.Ahora se requiere que los compiladores ignoren los atributos no estándar que no reconocen .
- La redacción de C++ 14 permitía a los compiladores rechazar atributos de ámbito desconocido.
Limpieza de sintaxis
Variables en línea
- Como funciones en línea
- El compilador elige dónde se crea una instancia de la instancia
- Desaprobar la redeclaración estática de constexpr , ahora implícitamente en línea.
namespace A::B
Sencillo
static_assert(expression);
sin cuerdano
throw
a menosthrow()
que ythrow()
seanoexcept(true)
.
Limpiador multirretorno y control de caudal
Encuadernaciones estructuradas
- Básicamente, primera clase
std::tie
conauto
- Ejemplo:
const auto [it, inserted] = map.insert( {"foo", bar} );
- Crea variables
it
yinserted
con tipo deducido delpair
quemap::insert
devuelve.
- Funciona con tuplas/pares similares &
std::array
s y estructuras relativamente planas - Enlaces estructurados realmente nombrados en estándar
- Básicamente, primera clase
if (init; condition)
yswitch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
- Extiende el
if(decl)
a casos en los quedecl
no se puede convertir a bool de manera sensata.
Generalización de bucles for basados en rangos
- Parece ser principalmente soporte para centinelas, o iteradores finales que no son del mismo tipo que los iteradores iniciales, lo que ayuda con bucles terminados en nulo y similares.
si constexpr
- Característica muy solicitada para simplificar el código casi genérico.
Varios
Literales de coma flotante hexadecimales
Asignación de memoria dinámica para datos sobrealineados
Elisión de copia garantizada
- ¡Finalmente!
- No en todos los casos, pero distingue la sintaxis en la que "simplemente estás creando algo" que se llamó elisión, de la "elisión genuina".
Orden de evaluación fijo para (algunas) expresiones con algunas modificaciones.
- No se incluyen argumentos de función, pero el intercalado de evaluación de argumentos de función ahora está prohibido
- Hace que un montón de código roto funcione principalmente y genera
.then
trabajo futuro.
Inicialización de lista directa de enumeraciones
Garantías de progreso hacia adelante (FPG) (también, FPG para algoritmos paralelos )
- Creo que esto quiere decir "es posible que la implementación no detenga los subprocesos 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
- Pruebe si la inclusión de un archivo de encabezado sería un error
- hace que la migración de experimental a estándar sea casi perfecta
Matrices de correcciones de conversión de punteros
Los constructores heredados corrigen algunos casos de esquina (consulte P0136R0 para ver ejemplos de cambios de comportamiento)
Inicialización agregada con herencia .
std::launder
, juegos de palabras tipográficos, etc.
Adiciones a la biblioteca:
Tipos de datos
std::variant<Ts...>
- ¿Casi siempre no está vacío la última vez que lo comprobé?
- Tipo de unión etiquetado
- {impresionante|útil}
std::optional
- Tal vez tenga uno de algo
- ridículamente útil
std::any
- Capacidad para uno de cualquier cosa (que se pueda copiar)
std::string_view
std::string
como referencia a matriz de caracteres o subcadena- Nunca vuelvas a tomar una
string const&
. También puede hacer que el análisis sea un millón de veces más rápido. "hello world"sv
- constexpr
char_traits
std::byte
más de lo que podían masticar.- Ni un número entero ni un carácter, sólo datos.
Invocar cosas
std::invoke
- Llame a cualquier invocable (puntero de función, función, puntero de miembro) con una sintaxis. Del concepto estándar INVOKE.
std::apply
- Toma una función similar a una tupla y descomprime la tupla en la llamada.
std::make_from_tuple
,std::apply
aplicado a la construcción de objetosis_invocable
,is_invocable_r
,invoke_result
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0077r2.html
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0604r0.html
- En desuso
result_of
is_invocable<Foo(Args...), R>
es "¿puedes llamar y conseguir algo compatible conFoo
? ", donde está el valor predeterminado.Args...
R
R=void
invoke_result<Foo, Args...>
¿ Esstd::result_of_t<Foo(Args...)>
aparentemente menos confuso?
Sistema de archivos TS v1
[class.path]
[class.filesystem.error]
[class.file_status]
[class.directory_entry]
[class.directory_iterator]
y[class.recursive_directory_iterator]
[fs.ops.funcs]
fstream
s se puede abrir conpath
s, así como conconst path::value_type*
cuerdas.
Nuevos algoritmos
for_each_n
reduce
transform_reduce
exclusive_scan
inclusive_scan
transform_exclusive_scan
transform_inclusive_scan
Agregado para fines de subprocesos, expuesto incluso si no los está utilizando en subprocesos.
Enhebrado
std::shared_mutex
- Sin tiempo, que puede ser más eficiente si no lo necesita.
atomic<T>
::is_always_lockfree
scoped_lock<Mutexes...>
- Ahorra algo de
std::lock
dolor al bloquear más de un mutex a la vez.
- Ahorra algo de
Paralelismo TS v1
- El documento vinculado de 2014 puede estar desactualizado.
- Versiones paralelas de
std
algoritmos y maquinaria relacionada.
hardware_*_interferencia_tamaño
(partes de) Library Fundamentals TS v1 no cubiertas arriba o abajo
[func.searchers]
y[alg.search]
- Un algoritmo y técnicas de búsqueda.
[pmr]
- Asignador polimórfico, como
std::function
para asignadores - Y algunos recursos de memoria estándar para acompañarlo .
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
- Asignador polimórfico, como
std::sample
, muestreo de un rango?
Mejoras en los contenedores
try_emplace
yinsert_or_assign
- ofrece mejores garantías en algunos casos en los que un movimiento/copia espurio sería malo
Empalme para
map<>
,unordered_map<>
,set<>
yunordered_set<>
- Mueva nodos entre contenedores de forma económica.
- Fusionar contenedores enteros de forma económica.
no constante
.data()
para cadena.no es miembro
std::size
,std::empty
,std::data
- como
std::begin
/end
- como
Soporte mínimo de tipos incompletos en contenedores.
"Concepto" de iterador contiguo
constexpr
iteradoresLa
emplace
familia de funciones ahora devuelve una referencia al objeto creado .
Cambios de puntero inteligente
unique_ptr<T[]>
correcciones y otrosunique_ptr
ajustes.weak_from_this
y algunos arreglados para compartir desde este
Otras std
mejoras de tipos de datos:
{}
construcciónstd::tuple
y otras mejoras- TriviallyCopyable reference_wrapper , puede aumentar el rendimiento
Varios
La biblioteca C++17 está basada en C11 en lugar de C99
Reservado
std[0-9]+
para futuras bibliotecas estándardestroy(_at|_n)
,uninitialized_move(_n)
,uninitialized_value_construct(_n)
,uninitialized_default_construct(_n)
- código de utilidad ya
std
expuesto en la mayoría de las implementaciones
- código de utilidad ya
Funciones matemáticas especiales
- A los científicos les pueden gustar
std::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
apenas
gcd
ylcm
std::uncaught_exceptions
- Requerido si solo quieres lanzar si estás a salvo de los destructores
std::as_const
std::bool_constant
Un montón de
_v
variables de plantillastd::void_t<T>
- Sorprendentemente útil al escribir plantillas.
std::owner_less<void>
- Me gusta
std::less<void>
, pero para que los punteros inteligentes ordenen según el contenido.
- Me gusta
std::chrono
polacostd::conjunction
,std::disjunction
,std::negation
expuestostd::not_fn
- http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
Reglas para noexcept dentro
std
std::is_contiguous_layout , útil para un hash eficiente
std::to_chars/std::from_chars , alto rendimiento, conversión de números independiente de la configuración regional; finalmente una forma de serializar/deserializar a formatos legibles por humanos (JSON & co)
std::default_order , indirección terminada( rompe el ABI de algunos compiladores debido a la alteración de nombres, se eliminó).std::less
.memory_order_consume
, lenguaje agregado para preferir el uso dememory_order_acquire
Rasgos
- intercambio
- es_agregado
- tiene_representaciones_de_objetos_unique
Obsoleto
- Algunas bibliotecas C ,
<codecvt>
result_of
, reemplazadas coninvoke_result
shared_ptr::unique
, no es muy seguro para subprocesos
Isocpp.org tiene una lista independiente de cambios desde C++ 14; ha sido parcialmente saqueada.
Naturalmente, el trabajo de TS continúa en paralelo, por lo que hay algunos TS que no están del todo maduros y tendrán que esperar a la siguiente iteración. El objetivo para la próxima iteración es C++20 como se planeó anteriormente, no C++19 como implicaban algunos rumores. Se ha evitado C++1O.
Lista inicial tomada de esta publicación de reddit y esta publicación de reddit , con enlaces agregados mediante búsqueda en Google o desde la página isocpp.org anterior.
Entradas adicionales saqueadas de la lista de pruebas de funciones del SD-6 .
La lista de funciones de clang y la lista de funciones de la biblioteca son las próximas en ser saqueadas. 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?) anteriormente obsoletas) que se eliminan en C++ 17 desde C++:
Remoto:
register
, palabra clave reservada para uso futurobool b; ++b;
- trígrafos
- Si aún los necesita, ahora son parte de la codificación de su archivo fuente, no parte del lenguaje.
- alias de ios
- auto_ptr,
<functional>
cosas viejas,random_shuffle
- asignadores en
std::function
Hubo reformulaciones. No estoy seguro de si esto tiene algún impacto en el código o si son solo limpiezas en el estándar:
Artículos aún no integrados en lo anterior:
P0505R0 (crono constexpr)
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 formen parte del sistema de tipos)
P0510R0 (restricciones de variantes)
P0504R0 (etiquetas para opcional/variante/cualquiera)
P0497R0 (ajustes de ptr compartidos)
P0508R0 (identificadores de nodos de enlaces estructurados)
P0521R0 (¿recuento de uso del puntero compartido y cambios únicos?)
Cambios de especificaciones:
- especificaciones de excepción y expresiones de lanzamiento
Referencia adicional:
artículos agrupados por año; no todos aceptados
https://isocpp.org/files/papers/p0636r0.html
- Debe actualizarse a "Modificaciones a funciones existentes" aquí.