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 unintmodernizando
usingcon...y listasLambda
constexpr lambdas
Capturando
*thisen lambdas[*this]{ std::cout << could << " be " << useful << '\n'; }Atributos
[[fallthrough]],[[nodiscard]],[[maybe_unused]]Atributos[[attributes]]ennamespacesyenum { erator[[s]] }usingen 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::BSimple
static_assert(expression);sin cuerdahay
throwmenosthrow(), ythrow()esnoexcept(true).Limpiador de retorno múltiple y control de flujo
Enlaces estructurados
std::tieconautoconst auto [it, inserted] = map.insert( {"foo", bar} );ityinsertedcon tipo deducido a partir delpairquemap::insertdevuelve.std::arraysy estructuras relativamente planasif (init; condition)yswitch (init; condition)if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)if(decl)casos a los quedeclno 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
.thenel 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_includeArreglos 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::optionalstd::anystd::string_viewstd::stringcomo 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"svchar_traitsstd::bytefuera más de lo que podían masticar.Invocar cosas
std::invokestd::applystd::make_from_tuple,std::applyaplicado a la construcción de objetosis_invocable`is_invocable_r`invoke_resultresult_ofis_invocable<Foo(Args...), R>es "se puede llamarFooconArgs...y obtener algo compatible conR", dondeR=voidestá 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]fstreams se puede abrir conpaths, así como conconst path::value_type*cadenas.Nuevos algoritmos
for_each_nreducetransform_reduceexclusive_scaninclusive_scantransform_exclusive_scantransform_inclusive_scanAgregado para propósitos de enhebrado, expuesto incluso si no los está utilizando enhebrado
Enhebrar
std::shared_mutexatomic<T>::is_always_lockfreescoped_lock<Mutexes...>std::lockdolor al bloquear más de un mutex a la vez.Paralelismo TS v1
stdalgoritmos 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::functionpara los asignadoresstd::sample, muestreo de un rango?Mejoras de contenedores
try_emplaceyinsert_or_assignEmpalme de
map<>,unordered_map<>,set<>, yunordered_set<>no constante
.data()para cadena.no miembro
std::size,std::empty,std::datastd::begin/endSoporte mínimo de tipo incompleto en contenedores
"Concepto" iterador contiguo
constexpriteradoresLa
emplacefamilia de funciones ahora devuelve una referencia al objeto creado .Cambios de puntero inteligente
unique_ptr<T[]>correcciones y otrosunique_ptrajustes.weak_from_thisy algunos arreglados para compartir de estoOtras
stdmejoras de tipo de datos:{}construcciónstd::tupley 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)stdimplementaciones expuestasstd::clamp()std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )aproximadamentegcdylcmstd::uncaught_exceptionsstd::as_conststd::bool_constant_vvariables 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::chronopolacostd::conjunction,std::disjunction,std::negationExpuestastd::not_fnstdstd :: 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_consumeresult_of, reemplazadas coninvoke_resultshared_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_shufflestd::functionHubo 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_consumeno parece estar oficialmente en desuso. Simplemente se desanima en la nota. ¿Quizás tiene sentido mencionar esto (con un paréntesis final, por ejemplo)?