¿Cuáles son las nuevas características en C ++ 17?

C ++ 17 ahora es una característica completa, por lo que es poco probable que experimente grandes cambios. Cientos de propuestas fueron presentadas para C ++ 17.

¿Cuáles de esas características se agregaron a C ++ en C ++ 17?

Al usar un comstackdor de C ++ que admita “C ++ 1z”, ¿cuáles de esas características estarán disponibles cuando el comstackdor actualice a C ++ 17?

Características del lenguaje:

Plantillas y código genérico

  • Deducción de argumento de plantilla para plantillas de clase

  • template

    • Representa un valor de cualquier tipo (argumento de plantilla no de tipo).
  • Arreglos de argumentos de plantilla sin tipo

  • template

  • (Plegables + … + expresiones) y revisiones

  • auto x{8}; es un int

  • modernizando using con ... y listas

Lambda

  • constexpr lambdas

    • Lambdas son implícitamente constexpr si califican
  • Capturando *this en lambdas

    • [*this]{ std::cout < < could << " be " << useful << '\n'; }

Atributos

  • [[fallthrough]] , [[nodiscard]] , [[maybe_unused]]

  • [[attributes]] en namespace s y enum { erator[[s]] }

  • using en atributos para evitar tener que repetir un espacio de nombre de atributo.

  • Los comstackdores ahora deben ignorar los atributos no estándar que no reconocen .

    • La redacción de C ++ 14 permitió a los comstackdores rechazar atributos de ámbito desconocido.

Limpieza de syntax

  • Variables en línea

    • Al igual que las funciones en línea
    • El comstackdor elige dónde se instancia la instancia
    • Desprecie la restatement de constexpr estática , ahora implícitamente en línea.
  • namespace A::B

  • Simple static_assert(expression); sin cadena

  • no throw menos que throw() y throw() sean noexcept(true) .

Limpiador multi-retorno y control de flujo

  • Enlaces estructurados

    • Básicamente, std::tie primera clase con auto
    • Ejemplo:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Crea variables e inserted con tipo deducido del pair que map::insert returns.
    • Funciona con tuple / pair-likes & std::array s y estructuras relativamente planas
    • Enlaces obligatorios realmente nombrados en estándar
  • if (init; condition) y switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Extiende el if(decl) a los casos donde decl no es convertible-to-bool de forma sensata.
  • Generalizando el rango para bucles

    • Parece ser principalmente soporte para centinelas o iteradores finales que no son del mismo tipo que iteradores de inicio, lo que ayuda con bucles terminados en nulos y similares.
  • si constexpr

    • Característica muy solicitada para simplificar el código casi genérico.

Misc

  • Literales de puntos flotantes hexadecimales

  • Asignación dinámica de memoria para datos sobre alineados

  • Elisión de copia garantizada

    • ¡Finalmente!
    • No en todos los casos, pero distingue la syntax en la que simplemente "estás creando algo" que se llamó elisión, de "elisión genuina".
  • Orden de evaluación fijo para (algunas) expresiones con algunas modificaciones

    • Sin incluir los argumentos de función, pero el intercalado de evaluación de argumento de función ahora está prohibido
    • Hace que un montón de códigos rotos funcionen principalmente, y hace .then en el trabajo futuro.
  • Inicialización directa de lista de enumeraciones

  • Garantías de avance de avance (FPG) (también, FPGs para algoritmos paralelos )

    • Creo que esto dice "la implementación no puede paralizar los hilos para siempre"?
  • u8'U', u8'T', u8'F', u8'8' literales de caracteres (cadena ya existente)

  • "noexcept" en el sistema de tipos

  • __has_include

    • Prueba si un archivo de cabecera incluye sería un error
    • hace que la migración de experimental a estándar sea casi perfecta
  • Arreglos de arreglos de conversión de puntero

  • los constructores heredados se arreglan en algunos casos de esquina (vea P0136R0 para ejemplos de cambios de comportamiento)

  • Inicialización agregada con herencia .

  • std::launder , type punning, etc.

Adiciones de la biblioteca:

Tipos de datos

  • std::variant

    • Casi siempre, no está vacío, lo último que revisé?
    • Etiquetado tipo de unión
    • {awesome | useful}
  • std::optional

    • Tal vez tiene uno de algo
    • Ridículamente útil
  • std::any

    • Contiene una de cualquier cosa (que se puede copiar)
  • std::string_view

    • std::string como referencia-a-carácter-matriz o subcadena
    • Nunca tome una string const& otra vez. También puede hacer el análisis un bajillon veces más rápido.
    • "hello world"sv
    • constexpr char_traits
  • std::byte off más de lo que podían masticar.

    • Ni un número entero ni un personaje, solo datos

Invocar cosas

  • std::invoke
    • Llame a cualquier invocable (puntero de función, función, puntero de miembro) con una syntax. Del concepto estándar INVOKE.
  • 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

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 con path s, así como también con const path::value_type* strings.

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á usando con rosca

Enhebrado

  • std::shared_mutex

    • Untimed, que puede ser más eficiente si no lo necesitas.
  • atomic ::is_always_lockfree

  • scoped_lock

    • Ahorra un poco de dolor std::lock al bloquear más de un mutex a la vez.
  • Paralelismo TS v1

    • El documento vinculado de 2014 puede estar desactualizado
    • Versiones paralelas de algoritmos std y maquinaria relacionada
  • hardware _ * _ interference_size

(partes de) Fundamentos de la Biblioteca TS v1 no cubiertos arriba o abajo

Mejoras de contenedores

  • try_emplace e insert_or_assign

    • da mejores garantías en algunos casos donde el movimiento / copia espuria sería malo
  • Empalme para map<> , unordered_map<> , set<> , y unordered_set<>

    • Mueva los nodos entre los contenedores de forma económica.
    • Fusiona contenedores enteros a bajo precio.
  • no const .data() para cadena.

  • non-member std::size , std::empty , std::data

    • como std::begin / end
  • Soporte mínimo tipo incompleto en contenedores

  • "Concepto" de iterador contiguo

  • constexpr iteradores

  • La familia de funciones emplace ahora devuelve una referencia al objeto creado .

Cambios inteligentes del puntero

  • unique_ptr y otros ajustes de unique_ptr .
  • weak_from_this y algunos arreglados para compartir desde este

Otras mejoras de tipo de datos estándar:

  • {} construcción de std::tuple y otras mejoras
  • TriviallyCopyable reference_wrapper , puede mejorar el rendimiento

Misc

  • La biblioteca C ++ 17 se basa en C11 en lugar de C99

  • Reservada estándar 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 implementaciones std expuestas
  • Funciones matemáticas especiales
    • los científicos pueden gustarles
  • std::clamp()
    • std::clamp( a, b, c ) == std::max( b, std::min( a, c ) ) aproximadamente
  • gcd y lcm
  • std::uncaught_exceptions
    • Obligatorio si solo quieres arrojar si está a salvo de destructores
  • std::as_const
  • std::bool_constant
  • Un grupo completo de variables de plantilla _v
  • std::void_t
    • Sorprendentemente útil al escribir plantillas
  • std::owner_less
    • como std::less , pero para que los punteros inteligentes clasifiquen según los contenidos
  • std::chrono polaco
  • std::conjunction , std::disjunction , std::negation exposed
  • std::not_fn
  • Reglas para no exceptuar dentro de std
  • std :: is_contiguous_layout , útil para hashing eficiente
  • std :: to_chars / std :: from_chars , alto rendimiento, conversión de número geográfico independiente ; finalmente una forma de serializar / deserializar a formatos legibles para humanos (JSON & co)
  • std :: default_order , indirection over std::less . ( rompe el ABI de algunos comstackdores debido al cambio de nombre, eliminado).

Rasgos

  • intercambiar
  • is_aggregate
  • has_unique_object_representations

Obsoleto

  • Algunas bibliotecas de C ,
  • memory_order_consume
  • result_of , reemplazado con invoke_result
  • shared_ptr::unique , no es muy threadsafe

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 no están del todo maduros que tendrán que esperar a la siguiente iteración. El objective para la próxima iteración es C ++ 20 como se planeó previamente, no C ++ 19 como implicaban algunos rumores. C ++ 1O se ha evitado.

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 anterior de isocpp.org.

Entradas adicionales extraídas de la lista de pruebas de funciones SD-6 .

La lista de características de clang y la lista de características de la biblioteca están próximas a ser saqueadas. Esto no parece ser confiable, ya que es C ++ 1z, no C ++ 17.

estas diapositivas tenían algunas características que faltan en otros lugares.

Si bien no se preguntó "qué se eliminó", aquí hay una breve lista de algunas cosas (¿en su mayoría?) Depreciadas anteriormente) que se eliminan en C ++ 17 de C ++:

Remoto:

  • register , palabra clave reservada para uso futuro
  • bool b; ++b;
  • trigrafos
    • si aún los necesita, ahora son parte de la encoding de su archivo fuente, no parte del lenguaje
  • ios aliases
  • auto_ptr, antiguo material , random_shuffle
  • asignadores en std::function

Hubo reformulaciones. No estoy seguro si estos tienen algún impacto en el código, o si solo son limpiezas en el estándar:

Papeles aún no integrados en lo anterior:

  • P0505R0 (constexpr chrono)

  • P0418R2 (ajustes atómicos)

  • P0512R0 (ajustes de deducción de argumento de plantilla)

  • P0490R0 (ajustes de enlace estructurados)

  • P0513R0 (cambia a std::hash )

  • P0502R0 (excepciones paralelas)

  • P0509R1 (actualización de restricciones en el manejo de excepciones)

  • P0012R1 (haga que las especificaciones de excepción sean parte del sistema de tipo)

  • P0510R0 (restricciones sobre variantes)

  • P0504R0 (tags para opcional / variante / cualquier)

  • P0497R0 (ajustes de ptr compartidos)

  • P0508R0 ( control de nodo de enlaces estructurados)

  • P0521R0 (uso compartido de puntero compartido y cambios únicos?)

Cambios de especificaciones:

  • especificaciones de excepción y expresiones de tiro

Referencia adicional: