C++17
Tipus | edició d'estàndard ISO ![]() |
---|---|
Versió inicial | desembre 2017 ![]() |
Epònim | 2017 ![]() |
Característiques tècniques | |
Plataforma | C standard library |
Més informació | |
Lloc web | iso.org… (anglès) ![]() |
| |
← C++14 ![]() C++20 ![]() |
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
[modifica]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.[1][2] Aquest DIS va ser aprovat per unanimitat, amb només comentaris editorials,[3] i l'estàndard final es va publicar el desembre de 2017.[4] 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
[modifica]C++17 va introduir moltes funcions noves. Les llistes següents poden estar incompletes.
Llenguatge
[modifica]- Fer que el missatge de text per a
static_assert
sigui opcional - Permet
typename
(com a alternativa aclass
) 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 denamespace 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 formaif constexpr(expression)
- Declaracions vinculants estructurades, que permeten
auto [a, b] = getTwoReturnValues();
- Inicialitzadors en declaracions
if
iswitch
- La inicialització de còpia i la inicialització directa d'objectes de tipus
T
a partir d'expressions prvalue de tipusT
(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 tipusstd::pair<double, bool>(5.0, false)
o una funció de plantilla auxiliar addicionalstd::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 a201703L
- 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 cadenastd::optional
, per representar objectes opcionals, un tipus de dades que no sempre pot ser retornat per un algorisme determinat amb suport per a no retornstd::any
, per mantenir valors únics de qualsevol tipus
std::uncaught_exceptions
, com a reemplaçament destd::uncaught_exception
en el maneig d'excepcions- Noves funcions d'inserció
try_emplace
iinsert_or_assign
per a estructures de dades associatives de valors-claustd::map
istd::unordered_map
- Accés uniforme al contenidor :
std::size
,std::empty
istd::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ó etiquetatstd::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
istd::negation
- Capçalera
<memory_resource>
, per a recursos de memòria polimòrfica
Referències
[modifica]- ↑ «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].