Conformità al linguaggio Visual C++

Questo argomento riepiloga la conformità agli standard di linguaggio ISO C++03, C++11, C++14 e bozza C++17 delle funzionalità del compilatore e delle funzionalità della libreria standard (STL) per Visual C++ in Visual Studio 2017 e versioni precedenti. Ogni nome di compilatore e di funzionalità STL è collegato al documento dello standard ISO C++ che descrive la funzionalità, se disponibile al momento della pubblicazione. La colonna Supportato elenca la prima versione di Visual Studio in cui è apparso il supporto della funzionalità.

Per informazioni sui miglioramenti della conformità e su altre modifiche in Visual Studio 2017, vedere Miglioramenti della conformità di C++ in Visual Studio 2017 e Novità di Visual C++ in Visual Studio 2017. Per le modifiche della conformità nelle versioni precedenti, vedere Cronologia delle modifiche di Visual C++ e Visual C++: novità dalla versione 2003 alla 2015. Per notizie aggiornate dal team di C++, visitare il blog del team di Visual C++.

Nota

Non sono state apportate modifiche binarie di rilevo tra Visual Studio 2015 e Visual Studio 2017.

Funzionalità del compilatore

Area funzionalità
Funzionalità del linguaggio di base C++03/11 Supportato
  Tutti gli altri elementi VS 2015 1
  Ricerca del nome in due fasi No
  N2634 Espressione SFINAE Parziale 2
  N1653 Preprocessore C99 Parziale 3
  N1988 Tipi integer estesi N/D 4
Funzionalità del linguaggio di base C++14 Supportato
  N3664 Possibilità di evitare/fondere allocazioni N/D 5
  N3323 Formulazione perfezionata per le conversioni contestuali Visual Studio 2013
  N3472 Valori letterali binari VS 2015
  N3638 Tipi restituiti auto e decltype(auto) VS 2015
  N3648 init-captures VS 2015
  N3649 Espressioni lambda generiche VS 2015
  N3651 Modelli di variabile VS 2015.2
  N3652 constexpr esteso VS 2017
  N3653 NSDMI per le aggregazioni VS 2017
  N3760 Attributi [[deprecated]] VS 2015
  N3778 Deallocazione dimensionata VS 2015
  N3781 Separatori di cifre VS 2015
Funzionalità del linguaggio di base C++17 Supportato
  N3922 Nuove regole per l'automazione con braced-init-list VS 2015
  N3928 static_assert concisa VS 2017 *
  N4051 typename in parametri di modello VS 2015
  N4086 Rimozione di trigrammi VS 2010
  N4230 Definizioni di spazi dei nomi annidati VS 2015.3 *
  N4261 Correzione delle conversioni di qualificazione No
  N4266 Attributi per spazi dei nomi ed enumeratori VS 2015
  N4267 Valori letterali carattere u8 VS 2015
  N4268 Possibilità di consentire più argomenti di modello non di tipo No
  N4295 Espressioni di riduzione No
  P0036R0 Rimozione di alcune riduzioni unarie No
  P0001R1 Rimozione della parola chiave register VS 2017.x *
  P0002R1 Rimozione di operator++ per bool No
  P0012R1 Aggiunta di noexcept al sistema di tipi No
  P0017R1 Inizializzazione aggregata estesa No
  P0018R3 Acquisizione *this per valore VS 2017.x *
  P0061R1 __has_include No
  P0136R1 Ridefinizione ereditarietà dei costruttori No
  P0138R2 direct-list-init delle enumerazioni fisse da numeri interi VS 2017.x *
  P0170R1 Espressioni lambda constexpr No
  P0184R0 Cicli for basati su intervallo generalizzati VS 2017
  P0188R1 Attributo [[fallthrough]] VS 2017 *
  P0189R1 Attributo [[nodiscard]] No
  P0212R1 Attributo [[maybe_unused]] VS 2017.x *
  P0245R1 Valori letterali hexfloat No
  P0028R4 Uso attributo namespaces senza ripetizione No
  P0035R4 Allocazione di memoria dinamica con ulteriore allineamento No
   P0091R3 Deduzione dell'argomento del modello per modelli di classe No
  P0127R2 Dichiarazione di parametri di modello non di tipo con auto No
  P0135R1 Elisione copia garantita No
  P0145R3 Ridefinizione ordine di valutazione di espressioni No
  P0217R3 Associazioni strutturate No
  P0283R2 Attributi non riconosciuti ignorati No
  P0292R2 Istruzioni if di constexpr No
  P0305R1 Istruzioni di selezione con inizializzatori No
  P0386R2 Variabili inline No
  P0522R0 Corrispondenza tra parametri di modello e argomenti compatibili No
  P0003R5 Rimozione di specifiche di eccezione dinamiche No
  P0195R2 Espansioni pack nelle dichiarazioni using No

Funzionalità della libreria standard/STL

Area funzionalità
Funzionalità della libreria standard C++17 Supportato
  P0433R2 Guide alla deduzione per STL No
  P0607R0 Variabili inline per STL (opzioni A e B2) No
  P0258R2 has_unique_object_representations No
  P0426R1 Constexpr per char_traits No
  P0604R0 Conversione di is_callable/result_of in is_invocable/invoke_result (opzioni A e B) No
  P0156R2 Ridenominazione della funzione variadic lock_guard come scoped_lock No
  P0558R1 Risoluzione delle incoerenze della classe di base con nome atomic No
  P0298R3 std::byte No
  P0063R3 Libreria Standard C11 No
  P0030R1 hypot (x, y, z) No
  P0435R1 Revisione di common_type
  P0548R1 Adattamento di common_type e duration
No
  P0513R0 Hash di poisoning
  P0599R1 Hash noexcept
No
  P0033R1 Ridefinizione di enable_shared_from_this No
  P0220R1 Library Fundamentals V1 Parziale 6
  P0414R2 shared_ptr<T[]>, shared_ptr<T[N]>
  P0497R0 Correzione shared_ptr per matrici
No
  P0084R2 Tipo restituito emplace No
  P0083R3 Splicing mappe e set
  P0508R0 Chiarimento di insert_return_type
No
  P0031R0 constexpr per <array> (nuovamente) e <iterator> No
  P0505R0 constexpr per <chrono > (nuovamente) No
  P0005R4 not_fn()
  P0358R1 Correzioni per not_fn()
No
  P0295R0 gcd(), lcm() No
  P0154R1 hardware_destructive_interference_size e altre No
  P0067R5 Conversioni di stringhe elementari No
  N4562 Nozioni fondamentali della libreria: ricerca di Boyer-Moore()
  P0253R1 Correzione dei tipi restituiti dal servizio di ricerca
No
  P0618R0 Deprecazione di <codecvt> No
  P0521R0 Deprecazione di shared_ptr::unique() No
  P0174R2 Deprecazione di parti superflue della libreria No
  P0003R5 Rimozione specifiche di eccezione dinamiche No
  P0302R1 Rimozione supporto allocatore in std::function No
  P0040R3 Estensione degli strumenti di gestione della memoria No
  N4562 Nozioni fondamentali della libreria: <memory_resource >
  P0337R0 Eliminazione assegnazione di polymorphic_allocator
No
  P0024R2 Algoritmi paralleli
  P0336R1 Ridenominazione dei criteri di esecuzione parallela
  P0394R4 Algoritmi paralleli devono avere terminate() per le eccezioni
  P0452R1 Unificazione degli algoritmi paralleli <numeric>
No
  P0226R1 Funzioni matematiche speciali No
  P0218R1 <filesystem >
  P0219R1 Percorsi relativi per file system
  P0392R0 Supporto string_view nei percorsi del file system
  P0430R2 Supporto di file system diversi da POSIX
  P0492R2 Risoluzione dei commenti NB per file system
No 7
  P0152R1 atomic::is_always_lock_free VS 2017.x
  P0403R1 UDL per <string_view> ("meow"sv e così via) VS 2017.x
  P0418R2 Requisiti per atomic compare_exchange memory_order VS 2017.x
  P0516R0 Contrassegno copia di shared_future come noexcept VS 2017.x
  P0517R0 Costruzione di future_error da future_errc VS 2017.x
  N4562 Nozioni fondamentali della libreria: <algorithm> sample() VS 2017
  N4562 Nozioni fondamentali della libreria: <any> VS 2017
  N4562 Nozioni fondamentali della libreria: <optional> VS 2017
  N4562 Nozioni fondamentali della libreria: <string_view> VS 2017
  N4562 Nozioni fondamentali della libreria: <tuple> apply() VS 2017
  P0032R3 Interfaccia omogenea per variant/any/optional VS 2017
  P0077R2 is_callable, is_nothrow_callable VS 2017
  P0088R3 <variant> VS 2017
  P0163R0 shared_ptr::weak_type VS 2017
  P0209R2 make_from_tuple() VS 2017
  P0254R2 Integrazione di string_view e std::string VS 2017
  P0307R2 Rendere nuovamente facoltativo maggiore o uguale VS 2017
  P0393R3 Rendere maggiore o uguale come variante VS 2017
  P0504R0 Revisione in_place_t/in_place_type_t<T>/in_place_index_t<I> VS 2017
  P0510R0 Rifiuto delle varianti di niente, matrici, riferimenti e tipi incompleti VS 2017
  P0025R1 clamp() VS 2015.3
  P0185R1 is_swappable, is_nothrow_swappable VS 2015.3
  P0272R1 basic_string::data() non-const VS 2015.3
  N4387 Ottimizzazione di pair e tuple VS 2015.2
  N4508 shared_mutex (non temporizzata) VS 2015.2
  P0004R1 Rimozione di alias iostream deprecati VS 2015.2
  P0006R0 Modelli di variabile per tratti di tipo (is_same_v e altri) VS 2015.2
  P0007R1 as_const() VS 2015.2
  P0013R1 Tratti di tipo operatore logico (conjunction e altri) VS 2015.2
  P0074R0 owner_less<> VS 2015.2
  P0092R1 <chrono> floor(), ceil(), round(), abs() VS 2015.2
  P0156R0 Variadic lock_guard VS 2015.2
  N3911 void_t VS 2015
  N4089 Conversioni sicure in unique_ptr<T[]> VS 2015
  N4169 invoke() VS 2015
  N4190 Rimozione auto_ptr, random_shuffle() ed elementi <functional> precedenti VS 2015
  N4258 Pulizia noexcept VS 2015
  N4259 uncaught_exceptions() VS 2015
  N4277 reference_wrapper facilmente copiabile VS 2015
  N4279 insert_or_assign()/try_emplace() per map/unordered_map VS 2015
  N4280 size(), empty(), data() VS 2015
  N4366 Assegnazione unique_ptr vincolata con precisione VS 2015
  N4389 bool_constant VS 2015
  N4510 Supporto tipi incompleti in vector/list/forward_list Visual Studio 2013
  N4284 Iteratori contigui N/D
  P0175R1 Riepiloghi per la libreria C N/D
  P0180R2 Prenotazione di spazi dei nomi per la standardizzazione futura N/D
  P0346R1 A <random> Ottimizzazione nomenclatura N/D
  P0371R1 Limitazione di memory_order_consume N/D
  P0467R2 Obbligo di iteratori in avanti per gli algoritmi paralleli N/D
  P0502R0 Algoritmi paralleli devono avere terminate() per le eccezioni, in genere N/D
  P0503R0 Correzione uso del tipo letterale della libreria N/D
  P0509R1 Aggiornamento limitazioni per la gestione delle eccezioni N/D
  P0518R1 Copia in algoritmi paralleli di elementi facilmente costruibili tramite copia N/D
  P0523R1 Limitazione dei requisiti di complessità degli algoritmi paralleli (generale) N/D
  P0574R1 Limitazione dei requisiti di complessità degli algoritmi paralleli (specifico) N/D
  P0623R0 Correzioni finali degli algoritmi paralleli C++17 N/D
Funzionalità della libreria standard C++14 Supportato
  N3462 result_of adatto a SFINAE VS 2015.2
  N3302 constexpr per <complex> VS 2015
  N3469 constexpr per <chrono> VS 2015
  N3470 constexpr per <array> VS 2015
  N3471 constexpr per <initializer_list>, <tuple>, <utility> VS 2015
  N3545 integral_constant::operator()() VS 2015
  N3642 UDL per <chrono>, <string> (1729ms, "meow"s e altri) VS 2015
  N3644 Iteratori in avanti Null VS 2015
  N3654 quoted() VS 2015
  N3657 Ricerca eterogenea di associativi VS 2015
  N3658 integer_sequence VS 2015
  N3659 shared_mutex (temporizzata) VS 2015
  N3668 exchange() VS 2015
  N3669 Correzione funzioni membro constexpr senza const VS 2015
  N3670 get<T>() VS 2015
  N3671 equal(), is_permutation(), mismatch() a doppio intervallo VS 2015
  N3778 Deallocazione dimensionata VS 2015
  N3779 UDL per <complex> (3.14i e altri) VS 2015
  N3789 constexpr per <functional> VS 2015
  N3887 tuple_element_t VS 2015
  N3891 Ridenominazione di shared_mutex (temporizzata) in shared_timed_mutex VS 2015
  N3346 Requisiti minimi elemento contenitore Visual Studio 2013
  N3421 Funtori di operatori trasparenti (less<> e altri) Visual Studio 2013
  N3655 Modelli di alias per <type_traits> (decay_t e altri) Visual Studio 2013
  N3656 make_unique() Visual Studio 2013
  N3924 Limitazione di rand() N/D

Un gruppo di documenti elencati insieme indica che una funzionalità è stata votata per l'aggiunta allo standard e che in seguito sono stati votati anche uno o più documenti per il miglioramento o l'espansione della funzionalità stessa. Queste funzionalità vengono implementate insieme.

Valori supportati

No significa che la funzionalità non è ancora implementata.
Parziale significa che l'implementazione in Visual Studio 2017 è incompleta. Per altre informazioni, vedere la sezione Note.
N/D significa che i documenti della proposta non descrivono le funzionalità. Questi documenti hanno modificato il linguaggio dello standard, ma non hanno creato lavoro per gli implementatori. Sono riportati di seguito per motivi di completezza.
VS 2010 indica le funzionalità supportate in Visual Studio 2010.
VS 2013 indica le funzionalità supportate in Visual Studio 2013.
VS 2015 indica le funzionalità supportate in Visual Studio 2015 RTM.
VS 2015.2 e VS 2015.3 indicano le funzionalità supportate rispettivamente in Visual Studio 2015 Update 2 e Visual Studio 2015 Update 3.
VS 2017 indica le funzionalità supportate in Visual Studio 2017 RTM.
Visual Studio 2017.x indica funzionalità le pianificate per un futuro aggiornamento di Visual Studio 2017.

Note

1 Ignora le specifiche di eccezione dinamiche di C++03, deprecate in C++11. L'implementazione delle specifiche non è prevista, nel frattempo verranno rimosse da un futuro standard C++.
2 Il supporto del compilatore per l'espressione SFINAE è stato sufficiente per la libreria standard a partire da Visual Studio 2015 Update 2, ma resta incompleto.
3 Il supporto del compilatore per le regole del preprocessore C99 è incompleto in Visual Studio 2017. Le macro variadic sono supportate, ma sono presenti molti bug nel comportamento del preprocessore.
4 Contrassegnato come non applicabile perché i compilatori sono consentiti, ma non obbligatori, per il supporto dei tipi Integer estesi. Come GCC e Clang, Microsoft ha scelto di non supportarli.
5 Analogamente, questo elemento è contrassegnato come non applicabile perché i compilatori sono consentiti, ma non obbligatori, per implementare questa ottimizzazione.
6 Le funzionalità che non sono state completate in Visual Studio 2015 sono descritte in dettaglio altrove in questa tabella.
7 La specifica tecnica del file system è implementata sia in <experimental/filesystem> che in <filesystem> per motivi di cronologia, ma l'implementazione deve essere corretta prima di spostare il relativo spazio dei nomi. Finché questa operazione non viene completata, la funzionalità è contrassegnata come non ancora implementata.
* Queste funzionalità sono protette dall'opzione /std:c++latest del compilatore.

Vedere anche

Riferimenti al linguaggio C++
Libreria standard C++
Miglioramenti della conformità di C++ in Visual Studio 2017
Novità di Visual C++ in Visual Studio 2017
Cronologia delle modifiche di Visual C++ dal 2003 al 2015
Visual C++: novità dalla versione 2003 alla 2015
Blog del team di Visual C++