Quali sono le nuove funzionalità in C ++ 17?


1007

C ++ 17 è ora completo di funzionalità, quindi è improbabile che subisca grandi cambiamenti. Centinaia di proposte sono state avanzate per C ++ 17.

Quali di queste funzionalità sono state aggiunte a C ++ in C ++ 17?

Quando si utilizza un compilatore C ++ che supporta "C ++ 1z", quale di queste funzionalità sarà disponibile quando il compilatore si aggiorna a C ++ 17?


26
Elenco completo delle funzionalità secondo Clang: libreria , linguaggio di base .
Kerrek SB,

3
questo blog ha un bel riassunto: bfilipek.com/2017/01/cpp17features.html
atb

13
Vedere il documento sulle modifiche ufficiali tra C ++ 14 e C ++ 17 DIS (P0636r0) per un elenco delle principali modifiche da C ++ 14 a C ++ 17.
jotik,

1
@RaghavNavada Great! La sezione C ++ 20 viene mantenuta? C'è il numero 53 , ma è chiuso ...
LF

Tutto in questo sito en.cppreference.com/w/cpp è contrassegnato con la versione richiesta.
jw_

Risposte:


1266

Caratteristiche del linguaggio:

Modelli e codice generico

Lambda

attributi

Pulizia della sintassi

Più pulito ritorno e controllo del flusso

  • Attacchi strutturati

    • Fondamentalmente, di prima classe std::tieconauto
    • Esempio:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Crea variabili ite insertedcon tipo dedotto da pairquello map::insertrestituito.
    • Funziona con tuple / pair-like & se std::arraycon strutture relativamente piatte
    • Attacchi strutturati nominati in realtà in standard
  • if (init; condition) e switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Estende i if(decl)casi in cui declnon è sensibilmente convertibile in bool.
  • Generalizzazione basata su range per loop

    • Sembra essere principalmente il supporto per le sentinelle o per gli iteratori finali che non sono dello stesso tipo degli iteratori iniziali, il che aiuta con loop a terminazione nulla e simili.
  • se constexpr

    • Funzione molto richiesta per semplificare il codice quasi generico.

Varie

Aggiunte alla biblioteca:

Tipi di dati

  • std::variant<Ts...>

    • Quasi sempre non vuoto per ultimo ho controllato?
    • Tipo di unione con tag
    • {Impressionante | utile}
  • std::optional

    • Forse contiene uno di qualcosa
    • Ridicolmente utile
  • std::any

    • Contiene uno di tutto (che è copiabile)
  • std::string_view

    • std::string come riferimento a array di caratteri o sottostringa
    • Non prenderlo mai string const&più. Inoltre può velocizzare l'analisi di un bajillion volte.
    • "hello world"sv
    • constexpr char_traits
  • std::byte più di quanto potessero masticare.

    • Né un numero intero né un carattere, solo dati

Invoca roba

File System TS v1

Nuovi algoritmi

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Aggiunto a scopo di threading, esposto anche se non li stai usando thread

Threading

(parti di) Library Fundamentals TS v1 non trattati sopra o sotto

Miglioramenti al contenitore

Modifiche al puntatore intelligente

Altri stdmiglioramenti del tipo di dati:

Varie

Tratti

Obsoleto

Isocpp.org ha un elenco indipendente di modifiche dal C ++ 14; è stato parzialmente saccheggiato.

Naturalmente il lavoro di TS continua in parallelo, quindi ci sono alcuni TS che non sono abbastanza maturi che dovranno aspettare la prossima iterazione. L'obiettivo della prossima iterazione è C ++ 20 come precedentemente pianificato, non C ++ 19 come suggerito da alcune voci. C ++ 1O è stato evitato.

Elenco iniziale tratto da questo post reddit e da questo post reddit , con collegamenti aggiunti tramite google o dalla pagina isocpp.org sopra.

Voci aggiuntive rubate dall'elenco dei test di funzionalità SD-6 .

elenco delle caratteristiche di clang e Lista funzione di libreria sono accanto a essere saccheggiati. Questo non sembra essere affidabile, in quanto è C ++ 1z, non C ++ 17.

queste diapositive avevano alcune caratteristiche mancanti altrove.

Mentre "cosa è stato rimosso" non è stato chiesto, ecco un breve elenco di alcune cose ((principalmente?) Precedenti deprecate) che sono state rimosse in C ++ 17 da C ++:

Rimosso:

Ci sono state riformulazioni. Non sono sicuro se questi abbiano alcun impatto sul codice o se siano solo ripuliture nello standard:

Documenti non ancora integrati in precedenza:

  • P0505R0 (constexpr chrono)

  • P0418R2 (modifiche atomiche)

  • P0512R0 (modifiche alla deduzione dell'argomento modello)

  • P0490R0 (modifiche di rilegatura strutturate)

  • P0513R0 (cambia in std::hash)

  • P0502R0 (eccezioni parallele)

  • P0509R1 (aggiornamento restrizioni sulla gestione delle eccezioni)

  • P0012R1 (rendere le specifiche di eccezione parte del sistema di tipi)

  • P0510R0 (restrizioni sulle varianti)

  • P0504R0 (tag per facoltativo / variante / qualsiasi)

  • P0497R0 ( ottimizzazioni ptr condivise)

  • P0508R0 (handle di nodo di binding strutturati)

  • P0521R0 (conteggio utilizzo puntatore condiviso e modifiche univoche?)

Modifiche alle specifiche:

Ulteriore riferimento:


2
Uhm, memory_order_consumenon sembra essere ufficialmente deprecato. È semplicemente scoraggiato nella nota. Forse ha senso menzionarlo (con una parentesi finale, per esempio)?
LF
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.