Pregunta ¿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 compilador de C ++ que admita "C ++ 1z", ¿cuáles de esas características estarán disponibles cuando el compilador actualice a C ++ 17?


831
2018-06-27 18:06


origen


Respuestas:


Características del lenguaje:

Plantillas y código genérico

Lambda

Atributos

Limpieza de sintaxis

Limpiador multi-retorno y control de flujo

  • Enlaces estructurados

    • Básicamente, primera clase std::tie con auto
    • Ejemplo:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Crea variables it y inserted con tipo deducido de la pair ese map::insert devoluciones.
    • Funciona con tuple / pair-likes y std::arrays y estructuras relativamente planas
    • En realidad nombrado enlaces estructurados 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 casos donde decl no es convertible a bool con sensatez
  • 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

Adiciones de la biblioteca:

Tipos de datos

  • std::variant<Ts...>

    • 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 tomes una string const& de nuevo. También puede hacer el análisis un bajillon veces más rápido.
    • "hello world"sv
    • constexpr char_traits
  • std::byte más de lo que podrían masticar.

    • Ni un número entero ni un personaje, 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á usando con rosca

Enhebrado

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

Mejoras de contenedores

Cambios inteligentes del puntero

Otro std Mejoras de tipo de datos:

Misc

Rasgos

Obsoleto

Isocpp.org tiene 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 objetivo 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 reddit y esta publicación reddit, con enlaces añadidos a través de Google o desde la página anterior de isocpp.org.

Entradas adicionales saqueadas de SD-6 lista de pruebas de características.

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

estas diapositivas tenía 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:

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 vinculantes estructurados)

  • P0513R0 (cambios 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 (etiquetas para opcional / variante / cualquier)

  • P0497R0 (ajustes de ptr compartidos)

  • P0508R0 (Controles de nodos de enlaces estructurados)

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

Cambios de especificaciones:

Referencia adicional:


1051
2018-06-27 18:06