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?
Respuestas:
Características del lenguaje:
Plantillas y Código Genérico
Deducción de argumentos de plantilla para plantillas de clase
template <auto>
Arreglos de argumentos de plantilla no tipo
template<template<class...>typename bob> struct foo {}
(Plegable + ... + expresiones) y Revisiones
auto x{8};
es unint
modernizando
using
con...
y listasLambda
constexpr lambdas
Capturando
*this
en lambdas[*this]{ std::cout << could << " be " << useful << '\n'; }
Atributos
[[fallthrough]]
,[[nodiscard]]
,[[maybe_unused]]
Atributos[[attributes]]
ennamespace
syenum { erator[[s]] }
using
en atributos para evitar tener que repetir un espacio de nombres de atributo.Los compiladores ahora deben ignorar los atributos no estándar que no reconocen .
Limpieza de sintaxis
Variables en línea
namespace A::B
Simple
static_assert(expression);
sin cuerdahay
throw
menosthrow()
, ythrow()
esnoexcept(true)
.Limpiador de retorno múltiple y control de flujo
Enlaces estructurados
std::tie
conauto
const auto [it, inserted] = map.insert( {"foo", bar} );
it
yinserted
con tipo deducido a partir delpair
quemap::insert
devuelve.std::array
sy estructuras relativamente planasif (init; condition)
yswitch (init; condition)
if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
if(decl)
casos a los quedecl
no se puede convertir de forma sensata.Generalización basada en rango para bucles
si constexpr
Misceláneos
Literales de coma flotante hexadecimal
Asignación de memoria dinámica para datos sobrealineados
Copia garantizada de elisión
Se corrigió el orden de evaluación para (algunas) expresiones con algunas modificaciones
.then
el trabajo futuro.Inicialización directa de listas de enumeraciones
Garantías de avance (FPG) (también, FPG para algoritmos paralelos )
u8'U', u8'T', u8'F', u8'8'
literales de caracteres (la cadena ya existía)"noexcept" en el sistema de tipos
__has_include
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
std::variant<Ts...>
std::optional
std::any
std::string_view
std::string
como referencia a matriz de caracteres o subcadenastring const&
vez más. También puede hacer que analizar un billón de veces más rápido."hello world"sv
char_traits
std::byte
fuera más de lo que podían masticar.Invocar cosas
std::invoke
std::apply
std::make_from_tuple
,std::apply
aplicado a la construcción de objetosis_invocable
`is_invocable_r
`invoke_result
result_of
is_invocable<Foo(Args...), R>
es "se puede llamarFoo
conArgs...
y obtener algo compatible conR
", dondeR=void
está predeterminado.invoke_result<Foo, Args...>
esstd::result_of_t<Foo(Args...)>
pero 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*
cadenas.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
std::shared_mutex
atomic<T>
::is_always_lockfree
scoped_lock<Mutexes...>
std::lock
dolor al bloquear más de un mutex a la vez.Paralelismo TS v1
std
algoritmos y maquinaria relacionada.hardware _ * _ tamaño de interferencia
(partes de) Fundamentos de la biblioteca TS v1 no cubiertos arriba o abajo
[func.searchers]
y[alg.search]
[pmr]
std::function
para los asignadoresstd::sample
, muestreo de un rango?Mejoras de contenedores
try_emplace
yinsert_or_assign
Empalme de
map<>
,unordered_map<>
,set<>
, yunordered_set<>
no constante
.data()
para cadena.no miembro
std::size
,std::empty
,std::data
std::begin
/end
Soporte mínimo de tipo incompleto en contenedores
"Concepto" 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 de estoOtras
std
mejoras de tipo de datos:{}
construcciónstd::tuple
y otras mejorasMisceláneos
La biblioteca C ++ 17 se basa 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)
std
implementaciones expuestasstd::clamp()
std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )
aproximadamentegcd
ylcm
std::uncaught_exceptions
std::as_const
std::bool_constant
_v
variables de plantillastd::void_t<T>
std::owner_less<void>
std::less<void>
, pero para que los punteros inteligentes los ordenen en función de los contenidosstd::chrono
polacostd::conjunction
,std::disjunction
,std::negation
Expuestastd::not_fn
std
std :: default_order , indirection over( rompe el ABI de algunos compiladores debido a la eliminación del nombre, eliminado).std::less
.Rasgos
Obsoleto
<codecvt>
memory_order_consume
result_of
, reemplazadas coninvoke_result
shared_ptr::unique
, no es muy seguroIsocpp.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:
register
, palabra clave reservada para uso futurobool b; ++b;
<functional>
cosas viejas ,random_shuffle
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:
documentos agrupados por año; no todos son aceptados
https://isocpp.org/files/papers/p0636r0.html
fuente
memory_order_consume
no parece estar oficialmente en desuso. Simplemente se desanima en la nota. ¿Quizás tiene sentido mencionar esto (con un paréntesis final, por ejemplo)?