iec - c++20
¿Cuáles son las nuevas características en C++ 17? (1)
Características del lenguaje:
Plantillas y Código Genérico
-
Deducción de argumentos de plantilla para plantillas de clase
- Como las funciones deducen argumentos de plantilla, ahora los constructores pueden deducir los argumentos de plantilla de la clase
- http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
-
- Representa un valor de cualquier tipo (argumento de plantilla sin tipo).
Lambda
-
- Las lambdas están implícitamente constexpr si califican
-
-
[*this]{ std::cout << could << " be " << useful << ''/n''; }
-
Atributos
-
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
atributos -
[[attributes]]
en losnamespace
denamespace
syenum { erator[[s]] }
-
using
atributos para evitar tener que repetir un espacio de nombres de atributos. -
Los compiladores ahora deben ignorar los atributos no estándar que no reconocen .
- La redacción de C ++ 14 permitió a los compiladores rechazar atributos de ámbito desconocidos.
Limpieza de sintaxis
-
- Como funciones en línea
- El compilador elige dónde se instancia la instancia
- Desaprobar la redeclaración constexpr estática , ahora implícitamente en línea.
-
Simple
static_assert(expression);
sin cuerda -
sin
throw
menos quethrow()
, ythrow()
seanoexcept(true)
.
Limpiador de retorno múltiple y control de flujo
-
-
Básicamente,
std::tie
primera clase conauto
-
Ejemplo:
-
const auto [it, inserted] = map.insert( {"foo", bar} );
-
Crea variables e
inserted
con el tipo deducido delpair
quemap::insert
devuelve.
-
-
Funciona con tuple / pair-likes &
std::array
sy estructuras relativamente planas - Enlaces estructurados realmente nombrados en estándar
-
Básicamente,
-
if (init; condition)
yswitch (init; condition)
-
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
-
Extiende el
if(decl)
a casos dondedecl
no es convertible a bool de manera sensata.
-
-
Generalización basada en rango para bucles
- Parece ser principalmente compatible con centinelas o iteradores finales que no son del mismo tipo que los iteradores iniciales, lo que ayuda con bucles terminados en nulo y similares.
-
- Característica muy solicitada para simplificar el código casi genérico.
Misceláneos
-
- ¡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 modifications
- 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
en el trabajo futuro.
-
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) -
- Probar si un archivo de encabezado incluir sería un error
- hace que la migración de experimental a estándar sea casi perfecta
-
Los constructores heredados corrigen algunos casos de esquina (consulte P0136R0 para ver ejemplos de cambios de comportamiento)
Adiciones de la biblioteca:
Tipos de datos
-
- Casi siempre no vacía la última vez que revisé?
- Etiquetado tipo de unión
- {impresionante | útil}
-
- Tal vez tiene uno de algo
- Ridículamente útil
-
- Tiene uno de cualquier cosa (que se puede copiar)
-
-
std::string
como referencia a matriz de caracteres o subcadena -
Nunca tome una
string const&
otra vez. También puede hacer que analizar un billón de veces más rápido. -
"hello world"sv
-
constexpr
char_traits
-
-
std::byte
más de lo que podrían masticar.- Ni un entero ni un carácter, solo 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
- 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
-
Deprecia el
result_of
-
is_invocable<Foo(Args...), R>
es "puedes llamar aFoo
conArgs...
y obtener algo compatible conR
", dondeR=void
es el valor predeterminado. -
invoke_result<Foo, Args...>
esstd::result_of_t<Foo(Args...)>
pero aparentemente menos confuso?
Sistema de archivos TS v1
-
[class.directory_iterator]
y[class.recursive_directory_iterator]
-
fstream
s se puede abrir con lapath
s, así como con las cadenasconst path::value_type*
.
Nuevos algoritmos
-
for_each_n
-
reduce
-
transform_reduce
-
exclusive_scan
-
inclusive_scan
-
transform_exclusive_scan
-
transform_inclusive_scan
-
Agregado para propósitos de enhebrado, expuesto incluso si no los está utilizando enhebrado
Enhebrar
-
- Sin tiempo, que puede ser más eficiente si no lo necesita.
-
atomic<T>
::is_always_lockfree
-
-
Ahorra un poco de dolor
std::lock
al bloquear más de un mutex a la vez.
-
Ahorra un poco de dolor
-
- El documento vinculado de 2014, puede estar desactualizado
-
Versiones paralelas de algoritmos
std
y maquinaria relacionada
(partes de) std::apply no cubiertos arriba o abajo
-
[func.searchers]
y[alg.search]
- Un algoritmo de búsqueda y técnicas
-
-
Asignador polimórfico, como
std::function
for allocators - 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 de contenedores
-
- da mejores garantías en algunos casos donde el movimiento / copia espurios sería malo
-
Empalme para
map<>
,unordered_map<>
,set<>
yunordered_set<>
- Mueva nodos entre contenedores a bajo costo.
- Fusionar contenedores enteros a bajo precio.
-
no const
.data()
para cadena. -
no miembro
std::size
,std::empty
,std::data
-
como
std::begin
/end
-
como
-
La familia de funciones de
emplace
ahora devuelve una referencia al objeto creado .
Cambios de puntero inteligente
-
unique_ptr<T[]>
correcciones y otros ajustes deunique_ptr
. -
weak_from_this
y algunos arreglados para compartir desde esto
Otras mejoras de tipo de datos estándar:
-
{}
construcción destd::tuple
y otras mejoras - TriviallyCopyable reference_wrapper , puede aumentar el rendimiento
Misceláneos
-
La biblioteca C ++ 17 se basa en C11 en lugar de C99
-
std[0-9]+
reservadostd[0-9]+
para futuras bibliotecas estándar -
-
código de utilidad ya en la mayoría de las implementaciones
std
expuestas
-
código de utilidad ya en la mayoría de las implementaciones
-
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
ylcm
-
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 variables de plantilla
_v
-
std::void_t<T>
- Sorprendentemente útil al escribir plantillas
-
std::owner_less<void>
-
como
std::less<void>
, pero para que los punteros inteligentes se ordenen según el contenido
-
como
-
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 , indirección sobre( rompe el ABI de algunos compiladores debido a la eliminación del nombre, eliminado).std::less
.
Rasgos
Obsoleto
- Algunas bibliotecas C ,
-
<codecvt>
-
memory_order_consume
-
result_of
, reemplazado coninvoke_result
-
shared_ptr::unique
, no es muy seguro
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 a 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 SD-6 características SD-6 .
La lista de características de clang y la lista de características de la library son las siguientes 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? Obsoletas anteriormente) que se eliminan en C ++ 17 de C ++:
Remoto:
-
register
, palabra clave reservada para uso futuro -
bool b; ++b;
-
trigraphs
- si aún los necesita, ahora son parte de la codificación de su archivo fuente, no parte del idioma
- alias ios
-
auto_ptr, material antiguo
<functional>
,random_shuffle
-
asignadores en
std::function
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:
-
https://isocpp.org/files/papers/p0636r0.html
- Debe actualizarse a "Modificaciones a las funciones existentes" aquí.
C ++ 17 ahora está completo, 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?