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

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

Quale di queste funzionalità è stata aggiunta 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?

Caratteristiche del linguaggio:

Modelli e codice generico

  • Deduzione dell’argomento modello per i modelli di class

  • template

    • Rappresenta un valore di qualsiasi tipo (argomento modello non di tipo).
  • Correzioni di argomenti modello non di tipo

  • template

  • (Pieghevole + … + espressioni) e Revisioni

  • auto x{8}; è un int

  • modernizzare using con ... e liste

Lambda

  • constexpr lambda

    • Lambdas sono implicitamente constexpr se si qualificano
  • Catturare *this in lambda

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

attributi

  • [[fallthrough]] , [[nodesscard]] , [[maybe_unused]] attributi

  • [[attributes]] su namespace s enum { erator[[s]] }

  • using attributi per evitare di dover ripetere uno spazio dei nomi attributo.

  • Ai compilatori è ora richiesto di ignorare attributi non standard che non riconoscono .

    • La dicitura C ++ 14 consentiva ai compilatori di rifiutare attributi con scope sconosciuti.

Pulizia della syntax

  • Variabili in linea

    • Come funzioni inline
    • Il compilatore seleziona dove viene istanziata l'istanza
    • Deprecare la ridichiarazione statica di constexpr , ora implicitamente in linea.
  • namespace A::B

  • Semplice static_assert(expression); senza corda

  • nessun throw meno che throw() e throw() è noexcept(true) .

Cleaner multi-return e controllo di stream

  • Attacchi strutturati

    • Fondamentalmente, std::tie prima class std::tie con auto
    • Esempio:
      • const auto [it, inserted] = map.insert( {"foo", bar} );
      • Crea variabili e inserted con tipo dedotto dalla pair che map::insert restituisce.
    • Funziona con tuple / pair-likes & std::array e con strutture relativamente piatte
    • Associazioni strutturate effettivamente denominate in standard
  • if (init; condition) e switch (init; condition)

    • if (const auto [it, inserted] = map.insert( {"foo", bar} ); inserted)
    • Estende if(decl) ai casi in cui decl non è convertibile in bool sensibilmente.
  • Generalizzando i cicli basati su intervalli

    • Sembra essere principalmente il supporto per le sentinelle o gli iteratori di fine diverso dallo stesso tipo degli iteratori iniziali, il che aiuta nei cicli con terminazione null e simili.
  • se constexpr

    • Funzione molto richiesta per semplificare il codice quasi generico.

Varie

  • Letterali a virgola mobile esadecimali

  • Allocazione dynamic della memoria per dati sovra allineati

  • Copia elisione garantita

    • Finalmente!
    • Non in tutti i casi, ma distingue la syntax in cui si "crea solo qualcosa" che si chiamava elision, da "vera elisione".
  • Corretto l'ordine di valutazione per (alcune) espressioni con alcune modifiche

    • Esclusi gli argomenti delle funzioni, ma l'argomento della valutazione degli argomenti delle funzioni è ora vietato
    • Fa funzionare un sacco di codice non funzionante, e lo fa in futuro.
  • Elenco diretto-inizializzazione delle enumerazioni

  • Forward Progress Garanzie (FPG) (anche, FPG per algoritmi paralleli )

    • Penso che questo stia dicendo "l'implementazione potrebbe non bloccare i thread per sempre"?
  • u8'U', u8'T', u8'F', u8'8' (la stringa esisteva già)

  • "noexcept" nel sistema di tipi

  • __has_include

    • Verifica se un file di intestazione include un errore
    • rende la migrazione da sperimentale a std quasi senza soluzione di continuità
  • Array di correzioni alla conversione del puntatore

  • costruttori ereditati risolti in alcuni casi angolari (vedi P0136R0 per esempi di modifiche del comportamento)

  • inizializzazione aggregata con ereditarietà .

  • std::launder , type punning, ecc

Aggiunte di libreria:

Tipi di dati

  • std::variant

    • Quasi l'ultimo non sempre vuoto 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 reference-to-character-array o sottostringa
    • Non prendere mai una string const& nuovo. Inoltre, è ansible effettuare l'analisi di un tempo di bajillion più veloce.
    • "hello world"sv
    • constexpr char_traits
  • std::byte off più di quanto potrebbero masticare.

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

Richiama roba

File System TS v1

  • [class.path]

  • [class.filesystem.error]

  • [class.file_status]

  • [class.directory_entry]

  • [class.directory_iterator] e [class.recursive_directory_iterator]

  • [fs.ops.funcs]

  • fstream s può essere aperto con il path s, così come con le stringhe const path::value_type* .

Nuovi algoritmi

  • for_each_n

  • reduce

  • transform_reduce

  • exclusive_scan

  • inclusive_scan

  • transform_exclusive_scan

  • transform_inclusive_scan

  • Aggiunto per scopi di threading, esposto anche se non li si utilizza in thread

threading

  • std::shared_mutex

    • Senza orario, che può essere più efficiente se non ne hai bisogno.
  • atomic ::is_always_lockfree

  • scoped_lock

    • Salva alcuni std::lock quando si blocca più di un mutex alla volta.
  • Parallelismo TS v1

    • Il documento collegato del 2014 potrebbe non essere aggiornato
    • Versioni parallele di algoritmi std e relativi macchinari
  • hardware _ * _ interference_size

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

Miglioramenti del contenitore

  • try_emplace e insert_or_assign

    • offre migliori garanzie in alcuni casi in cui la mossa / copia spuria sarebbe negativa
  • Splicing per map<> , unordered_map<> , set<> e unordered_set<>

    • Spostare i nodes tra i contenitori a basso costo.
    • Unisci interi contenitori a basso costo.
  • non-const .data() per stringa.

  • non membro std::size , std::empty , std::data

    • come std::begin / end
  • Supporto di tipo minimo incompleto in contenitori

  • "Concetto" di iteratore contiguo

  • iteratori di constexpr

  • La famiglia di funzioni emplace ora restituisce un riferimento all'object creato .

Il puntatore intelligente cambia

  • unique_ptr correzioni e altre modifiche unique_ptr .
  • weak_from_this e alcuni fissi su condivisi da questo

Altri miglioramenti del tipo di dati std :

  • {} costruzione di std::tuple e altri miglioramenti
  • TriviallyCopyable reference_wrapper , può essere un aumento delle prestazioni

Varie

  • La libreria C ++ 17 si basa su C11 anziché su C99

  • Riservato std[0-9]+ per future librerie standard

  • destroy(_at|_n) , uninitialized_move(_n) , uninitialized_value_construct(_n) , uninitialized_default_construct(_n)

    • codice di utilità già presente nella maggior parte delle implementazioni std esposte
  • Funzioni matematiche speciali
    • gli scienziati potrebbero piacere a loro
  • std::clamp()
    • std::clamp( a, b, c ) == std::max( b, std::min( a, c ) ) circa
  • gcd e lcm
  • std::uncaught_exceptions
    • Obbligatorio se si vuole lanciare solo se al sicuro da distruttori
  • std::as_const
  • std::bool_constant
  • Un intero gruppo di variabili di template _v
  • std::void_t
    • Sorprendentemente utile durante la scrittura di modelli
  • std::owner_less
    • come std::less , ma per i puntatori intelligenti per ordinare in base ai contenuti
  • std::chrono polish
  • std::conjunction , std::disjunction , std::negation esposta
  • std::not_fn
  • Regole per no-outs all'interno di std
  • std :: is_contiguous_layout , utile per l'hashing efficiente
  • std :: to_chars / std :: from_chars , conversione di numeri agnostici locali ad alte prestazioni; infine un modo per serializzare / deserializzare in formati leggibili dall'uomo (JSON & co)
  • std :: default_order , indirection su std::less . ( interrompe l'ABI di alcuni compilatori a causa del nome mangling, rimosso).

Tratti

  • scambiare
  • is_aggregate
  • has_unique_object_representations

deprecato

  • Alcune librerie C ,
  • memory_order_consume
  • result_of , sostituito con invoke_result
  • shared_ptr::unique , non è molto sicuro

Isocpp.org ha un elenco indipendente di modifiche da C ++ 14; è stato in parte 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'objective per la prossima iterazione è C ++ 20 come precedentemente programmato, non C ++ 19 come alcune voci implicite. C ++ 1O è stato evitato.

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

Ulteriori voci depredate dall'elenco di test delle caratteristiche dell'SD-6 .

la lista delle caratteristiche di clang e la lista delle caratteristiche della biblioteca sono prossime a essere saccheggiate. Questo non sembra affidabile, poiché è C ++ 1z, non C ++ 17.

queste diapositive avevano alcune caratteristiche mancanti altrove.

Mentre non è stato chiesto "cosa è stato rimosso", ecco un breve elenco di alcune cose (per lo più?) Deprecate in precedenza) che vengono rimosse in C ++ 17 da C ++:

Rimosso:

  • register , parola chiave riservata per uso futuro
  • bool b; ++b;
  • trigraph
    • se ne hai ancora bisogno, ora fanno parte della codifica del tuo codice sorgente, non parte del linguaggio
  • ios alias
  • auto_ptr, vecchio materiale, random_shuffle
  • allocatori in std::function

Ci furono delle riformulazioni. Non sono sicuro che questi abbiano un impatto sul codice o se siano solo delle pulizie nello standard:

Carte non ancora integrate in:

  • P0505R0 (constexpr chrono)

  • P0418R2 (modifiche atomiche)

  • P0512R0 (modifiche alla deduzione degli argomenti del modello)

  • P0490R0 (modifiche dell'associazione strutturata)

  • P0513R0 (cambia in std::hash )

  • P0502R0 (eccezioni parallele)

  • P0509R1 (aggiornamento delle restrizioni sulla gestione delle eccezioni)

  • P0012R1 (rendere le specifiche delle eccezioni essere parte del sistema di tipi)

  • P0510R0 (restrizioni sulle varianti)

  • P0504R0 (tag per facoltativo / variante / qualsiasi)

  • P0497R0 (modifiche ptr condivise)

  • P0508R0 (handle del nodo di binding strutturato)

  • P0521R0 (il puntatore condiviso utilizza il conteggio e le modifiche univoche?)

Cambiamenti delle specifiche:

  • specifiche di eccezione e espressioni di lancio

Ulteriore riferimento: