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

1007

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?

Yakk - Adam Nevraumont
fuente
26
Lista completa de características según Clang: biblioteca , lenguaje central .
Kerrek SB
3
este blog bost tiene un buen resumen: bfilipek.com/2017/01/cpp17features.html
atb
13
Consulte el documento oficial Cambios entre C ++ 14 y C ++ 17 DIS (P0636r0) para obtener una lista de los principales cambios de C ++ 14 a C ++ 17.
jotik
1
@RaghavNavada ¡Genial! ¿Se mantiene la sección C ++ 20? Hay # 53 , pero está cerrado ...
LF
Todo en este sitio en.cppreference.com/w/cpp está marcado con la versión requerida.
jw_

Respuestas:

1266

Características del lenguaje:

Plantillas y Código Genérico

Lambda

Atributos

Limpieza de sintaxis

Limpiador de retorno múltiple y control de flujo

  • Enlaces estructurados

    • Básicamente, de primera clase std::tieconauto
    • Ejemplo:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Crea variables ity insertedcon tipo deducido a partir del pairque map::insertdevuelve.
    • Funciona con tuple / pair-likes & std::arraysy estructuras relativamente planas
    • Enlaces estructurados realmente nombrados en estándar
  • if (init; condition) y switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Extiende los if(decl)casos a los que declno se puede convertir de forma 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 los bucles terminados en nulo y similares.
  • si constexpr

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

Misceláneos

Adiciones a la biblioteca:

Tipos de datos

  • std::variant<Ts...>

    • Casi siempre no vacía la última vez que revisé?
    • Etiquetado tipo de unión
    • {impresionante | útil}
  • std::optional

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

    • Tiene uno de cualquier cosa (que se puede copiar)
  • std::string_view

    • std::string como referencia a matriz de caracteres o subcadena
    • Nunca tomes una string const&vez más. También puede hacer que analizar un billón de veces más rápido.
    • "hello world"sv
    • constexpr char_traits
  • std::byte fuera más de lo que podían masticar.

    • Ni un entero ni un carácter, solo datos

Invocar cosas

Sistema de archivos TS v1

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

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

Mejoras de contenedores

Cambios de puntero inteligente

Otras stdmejoras de tipo de datos:

Misceláneos

Rasgos

Obsoleto

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 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:

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:

Yakk - Adam Nevraumont
fuente
2
Um, 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)?
LF