# C++17

C++17 és una versió de l'estàndard ISO / IEC 14882 per al llenguatge de programació C++. C++17 va substituir la versió anterior de l'estàndard C++, anomenada C++14, i més tard va ser substituïda per C++20.

## Història

Abans que el Comitè de Normes de C++ fixés un cicle de llançament de 3 anys, la data de llançament de C++17 era incerta. En aquest període de temps, la revisió de C++17 també es va anomenar C++1z, seguint C++0x o C++1x per a C++11 i C++1y per a C++14. L'especificació C++17 va arribar a l'etapa de Draft International Standard (DIS) el març de 2017. Aquest DIS va ser aprovat per unanimitat, amb només comentaris editorials, i l'estàndard final es va publicar el desembre de 2017. Es van fer pocs canvis a la biblioteca de plantilles estàndard de C++, tot i que alguns algorismes de la capçalera <algorithm> van rebre suport per a la paral·lelització explícita i es van fer algunes millores sintàctiques.

## Noves característiques

C++17 va introduir moltes funcions noves. Les llistes següents poden estar incompletes.

### Llenguatge

* Fer que el missatge de text per a static_assert sigui opcional
* Permet typename (com a alternativa a class ) en un paràmetre de plantilla de plantilla
* Noves regles per a la deducció auto de braced-init-list
* Definicions d'espai de noms imbricats, per exemple, namespace X::Y { … } en lloc de namespace X { namespace Y { … } }
* Permet atributs per a espais de noms i enumeradors
* Nous atributs estàndard [[fallthrough]], [[maybe_unused]] i [[nodiscard]]
* Literals de caràcters UTF-8 (u8) (Els literals de cadena UTF-8 existeixen des de C++11 ; C++17 afegeix els literals de caràcters corresponents per a la coherència, encara que com que estan restringits a un sol byte, només pot emmagatzemar codis de control " Llatí bàsic " i C0, és a dir ASCII)
* Literals hexadecimals de coma flotant
* Ús d' auto com a tipus per a un paràmetre de plantilla no tipus
* Avaluació constant per a tots els arguments de plantilla no tipus
* Plegar expressions, per a plantilles variàdiques
* Un if en temps de compilació estàtic amb la forma if constexpr(expression)
* Declaracions vinculants estructurades, que permeten auto [a, b] = getTwoReturnValues;
* Inicialitzadors en declaracions if i switch
* La inicialització de còpia i la inicialització directa d'objectes de tipus T a partir d'expressions prvalue de tipus T (ignorant els qualificadors cv de nivell superior) no permetran copiar ni moure constructors de l'expressió prvalue. Vegeu l'elisió de còpia per a més informació.
* Algunes extensions sobre l'assignació de memòria sobrealineada
* Deducció d'arguments de plantilla de classe (CTAD), introduint guies de deducció de constructors, p. ex. permetent std::pair(5.0, false) en lloc de requerir arguments de constructor explícits tipus std::pair<double, bool>(5.0, false) o una funció de plantilla auxiliar addicional std::make_pair(5.0, false).
* Variables en línia, que permet la definició de variables als fitxers de capçalera sense infringir la regla de definició única. Les regles són efectivament les mateixes que les funcions en línia
* __has_include, permetent que les directives del preprocessador comprovin la disponibilitat d'una capçalera
* El valor de __cplusplus ha canviat a 201703L
* Les especificacions d'excepció es van fer part del tipus de funció
* Les expressions lambda poden capturar "*això" per valor
Biblioteca
* La majoria dels Fonaments de la Biblioteca TS I, incloent:
** std::string_view, una referència de només lectura que no és propietari d'una seqüència de caràcters o una porció de cadena
** std::optional, per representar objectes opcionals, un tipus de dades que no sempre pot ser retornat per un algorisme determinat amb suport per a no retorn
** std::any, per mantenir valors únics de qualsevol tipus
* std::uncaught_exceptions, com a reemplaçament de std::uncaught_exception en el maneig d'excepcions
* Noves funcions d'inserció try_emplace i insert_or_assign per a estructures de dades associatives de valors-clau std::map i std::unordered_map
* Accés uniforme al contenidor : std::size, std::empty i std::data
* Definició de " iteradors contigus"
* Una biblioteca del sistema de fitxers basada en boost::filesystem
* Versions paral·leles d'algorismes STL
* Funcions especials matemàtiques addicionals, incloses integrals el·líptiques i funcions de Bessel
* std::variant, un contenidor d'unió etiquetat
* std::byte, permetent substituir char per als tipus de dades que pretenen modelar un byte de dades com un byte en lloc d'un caràcter
* Característiques de l'operador lògic: std::conjunction, std::disjunction i std::negation
* Capçalera <memory_resource>, per a recursos de memòria polimòrfica

## Referències

* ↑ «N4661 Editors' Report -- Programming Languages -- C++» (en anglès), 21-03-2017. Arxivat de l'original el 2020-02-04. [Consulta: 21 març 2017].
* ↑ «ISO/IEC DIS 14882: Programming Languages — C++» (en anglès). Arxivat de l'original el 2017-03-25.
* ↑ Herb Sutter. «C++17 is formally approved» (en anglès), 06-09-2017. Arxivat de l'original el 29 gener 2020. [Consulta: 12 setembre 2017].
* ↑ «ISO/IEC 14882:2017» (en anglès). Arxivat de l'original el 2013-01-29. [Consulta: 3 desembre 2017].