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

Resuelto asked hace 8 años • 1 respuestas

C++17 ahora tiene todas las funciones, 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?

 avatar Jun 28 '16 01:06
Aceptado

Características del idioma:

Plantillas y código genérico

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

    • Al igual que las funciones deducen los argumentos de la plantilla, ahora los constructores pueden deducir los argumentos de la plantilla de la clase.
    • http://wg21.link/p0433r2 http://wg21.link/p0620r0 http://wg21.link/p0512r0
  • template <auto>

    • Representa un valor de cualquier tipo (argumento de plantilla que no sea de tipo).
  • Correcciones de argumentos de plantilla que no son de tipo

  • template<template<class...>typename bob> struct foo {}

  • ( Plegado +... + expresiones ) y Revisiones

  • auto x{8};es unint

  • modernizando usingcon ...y listas

lambda

  • lambdas constexpr

    • Las lambdas son implícitamente consistentes si califican.
  • Capturando *thisen lambdas

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

Atributos

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

  • [[attributes]]en namespaces yenum { erator[[s]] }

  • usingen atributos para evitar tener que repetir un espacio de nombres de atributo.

  • Ahora se requiere que los compiladores ignoren los atributos no estándar que no reconocen .

    • La redacción de C++ 14 permitía a los compiladores rechazar atributos de ámbito desconocido.

Limpieza de sintaxis

  • Variables en línea

    • Como funciones en línea
    • El compilador elige dónde se crea una instancia de la instancia
    • Desaprobar la redeclaración estática de constexpr , ahora implícitamente en línea.
  • namespace A::B

  • Sencillo static_assert(expression);sin cuerda

  • no throwa menosthrow() que y throw()sea noexcept(true).

Limpiador multirretorno y control de caudal

  • Encuadernaciones estructuradas

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

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Extiende el if(decl)a casos en los que declno se puede convertir a bool de manera sensata.
  • Generalización de bucles for basados ​​en rangos

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

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

Varios

  • Literales de coma flotante hexadecimales

  • Asignación de memoria dinámica para datos sobrealineados

  • Elisión de copia garantizada

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

    • No se incluyen argumentos de función, pero el intercalado de evaluación de argumentos de función ahora está prohibido
    • Hace que un montón de código roto funcione principalmente y genera .thentrabajo futuro.
  • Inicialización de lista directa de enumeraciones

  • Garantías de progreso hacia adelante (FPG) (también, FPG para algoritmos paralelos )

    • Creo que esto quiere decir "es posible que la implementación no detenga los subprocesos para siempre".
  • u8'U', u8'T', u8'F', u8'8'literales de caracteres (la cadena ya existía)

  • "noexcept" en el sistema de tipos

  • __has_include

    • Pruebe si la inclusión de un archivo de encabezado sería un error
    • hace que la migración de experimental a estándar sea casi perfecta
  • Matrices de correcciones de conversión de punteros

  • Los constructores heredados corrigen algunos casos de esquina (consulte P0136R0 para ver ejemplos de cambios de comportamiento)

  • Inicialización agregada con herencia .

  • std::launder, juegos de palabras tipográficos, etc.

Adiciones a la biblioteca:

Tipos de datos

  • std::variant<Ts...>

    • ¿Casi siempre no está vacío la última vez que lo comprobé?
    • Tipo de unión etiquetado
    • {impresionante|útil}
  • std::optional

    • Tal vez tenga uno de algo
    • ridículamente útil
  • std::any

    • Capacidad para uno de cualquier cosa (que se pueda copiar)
  • std::string_view

    • std::stringcomo referencia a matriz de caracteres o subcadena
    • Nunca vuelvas a tomar una string const&. También puede hacer que el análisis sea un millón de veces más rápido.
    • "hello world"sv
    • constexprchar_traits
  • std::bytemás de lo que podían masticar.

    • Ni un número entero ni un carácter, sólo datos.

Invocar cosas

  • std::invoke

    • Llame a cualquier invocable (puntero de función, función, puntero de miembro) con una sintaxis. Del concepto estándar INVOKE.
  • std::apply

    • Toma una función similar a una tupla y descomprime la tupla en la llamada.
  • std::make_from_tuple, std::applyaplicado a la construcción de objetos

  • is_invocable, is_invocable_r,invoke_result

    • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0077r2.html
    • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0604r0.html
    • En desusoresult_of
    • is_invocable<Foo(Args...), R>es "¿puedes llamar y conseguir algo compatible con Foo? ", donde está el valor predeterminado.Args...RR=void
    • invoke_result<Foo, Args...>¿ Es std::result_of_t<Foo(Args...)>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 con paths, así como con const path::value_type*cuerdas.

Nuevos algoritmos

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Agregado para fines de subprocesos, expuesto incluso si no los está utilizando en subprocesos.

Enhebrado

  • std::shared_mutex

    • Sin tiempo, que puede ser más eficiente si no lo necesita.
  • atomic<T>::is_always_lockfree

  • scoped_lock<Mutexes...>

    • Ahorra algo de std::lockdolor al bloquear más de un mutex a la vez.
  • Paralelismo TS v1

    • El documento vinculado de 2014 puede estar desactualizado.
    • Versiones paralelas de stdalgoritmos y maquinaria relacionada.
  • hardware_*_interferencia_tamaño

(partes de) Library Fundamentals TS v1 no cubiertas arriba o abajo

  • [func.searchers]y[alg.search]

    • Un algoritmo y técnicas de búsqueda.
  • [pmr]

    • Asignador polimórfico, como std::functionpara asignadores
    • Y algunos recursos de memoria estándar para acompañarlo .
    • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
  • std::sample, muestreo de un rango?

Mejoras en los contenedores

  • try_emplaceyinsert_or_assign

    • ofrece mejores garantías en algunos casos en los que un movimiento/copia espurio sería malo
  • Empalme para map<>, unordered_map<>, set<>yunordered_set<>

    • Mueva nodos entre contenedores de forma económica.
    • Fusionar contenedores enteros de forma económica.
  • no constante .data()para cadena.

  • no es miembro std::size, std::empty,std::data

    • como std::begin/end
  • Soporte mínimo de tipos incompletos en contenedores.

  • "Concepto" de iterador contiguo

  • constexpriteradores

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

Cambios de puntero inteligente

  • unique_ptr<T[]>correcciones y otros unique_ptrajustes.
  • weak_from_thisy algunos arreglados para compartir desde este

Otras stdmejoras de tipos de datos:

  • {}construcción std::tupley otras mejoras
  • TriviallyCopyable reference_wrapper , puede aumentar el rendimiento

Varios

  • La biblioteca C++17 está basada en C11 en lugar de C99

  • Reservado 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 stdexpuesto en la mayoría de las implementaciones
  • Funciones matemáticas especiales

    • A los científicos les pueden gustar
  • std::clamp()

    • std::clamp( a, b, c ) == std::max( b, std::min( a, c ) )apenas
  • gcdylcm

  • std::uncaught_exceptions

    • Requerido si solo quieres lanzar si estás a salvo de los destructores
  • std::as_const

  • std::bool_constant

  • Un montón de _vvariables de plantilla

  • std::void_t<T>

    • Sorprendentemente útil al escribir plantillas.
  • std::owner_less<void>

    • Me gusta std::less<void>, pero para que los punteros inteligentes ordenen según el contenido.
  • std::chronopolaco

  • std::conjunction, std::disjunction,std::negation expuesto

  • std::not_fn

    • http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0358r1.html
  • Reglas para noexcept dentrostd

  • std::is_contiguous_layout , útil para un hash eficiente

  • std::to_chars/std::from_chars , alto rendimiento, conversión de números independiente de la configuración regional; finalmente una forma de serializar/deserializar a formatos legibles por humanos (JSON & co)

  • std::default_order , indirección terminada std::less. ( rompe el ABI de algunos compiladores debido a la alteración de nombres, se eliminó).

  • memory_order_consume, lenguaje agregado para preferir el uso dememory_order_acquire

Rasgos

  • intercambio
  • es_agregado
  • tiene_representaciones_de_objetos_unique

Obsoleto

  • Algunas bibliotecas C ,
  • <codecvt>
  • result_of, reemplazadas coninvoke_result
  • shared_ptr::unique, no es muy seguro para subprocesos

Isocpp.org tiene una lista independiente de cambios desde C++ 14; ha sido parcialmente saqueada.

Naturalmente, el trabajo de TS continúa en paralelo, por lo que hay algunos TS que no están del todo maduros y tendrán que esperar a la siguiente iteración. El objetivo para la próxima iteración es C++20 como se planeó anteriormente, no C++19 como implicaban algunos rumores. Se ha evitado C++1O.

Lista inicial tomada de esta publicación de reddit y esta publicación de reddit , con enlaces agregados mediante búsqueda en Google o desde la página isocpp.org anterior.

Entradas adicionales saqueadas de la lista de pruebas de funciones del SD-6 .

La lista de funciones de clang y la lista de funciones de la biblioteca son las próximas en ser saqueadas. 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?) anteriormente obsoletas) que se eliminan en C++ 17 desde C++:

Remoto:

  • register, palabra clave reservada para uso futuro
  • bool b; ++b;
  • trígrafos
    • Si aún los necesita, ahora son parte de la codificación de su archivo fuente, no parte del lenguaje.
  • alias de ios
  • auto_ptr, <functional>cosas viejas,random_shuffle
  • asignadores enstd::function

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

Artículos aún no integrados en lo anterior:

  • P0505R0 (crono constexpr)

  • 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 formen parte del sistema de tipos)

  • P0510R0 (restricciones de variantes)

  • P0504R0 (etiquetas para opcional/variante/cualquiera)

  • P0497R0 (ajustes de ptr compartidos)

  • P0508R0 (identificadores de nodos de enlaces estructurados)

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

Cambios de especificaciones:

  • especificaciones de excepción y expresiones de lanzamiento

Referencia adicional:

  • artículos agrupados por año; no todos aceptados

  • https://isocpp.org/files/papers/p0636r0.html

    • Debe actualizarse a "Modificaciones a funciones existentes" aquí.
Yakk - Adam Nevraumont avatar Jun 27 '2016 18:06 Yakk - Adam Nevraumont