Conformità al linguaggio Visual C++

Questo argomento riepiloga la conformità agli standard di linguaggio ISO C++03, C++11, C++14, C++17 e bozza C++20 delle funzionalità del compilatore e delle funzionalità della libreria standard per Visual C++ in Visual Studio 2017 e versioni precedenti. Ogni nome di compilatore e di funzionalità della libreria standard è collegato al documento di proposta 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 A
  Ricerca del nome in due fasi Parziale B
  N2634 Espressione SFINAE Parziale C
  N1653 Preprocessore C99 Parziale D
  N1988 Tipi integer estesi N/D E
Funzionalità del linguaggio di base C++14 Supportato
  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
  N3760 Attributi [[deprecated]] VS 2015
  N3778 Deallocazione dimensionata VS 2015
  N3781 Separatori di cifre VS 2015
  N3651 Modelli di variabile VS 2015.2
  N3652 constexpr esteso VS 2017
  N3653 NSDMI per le aggregazioni VS 2017
  N3664 Possibilità di evitare/fondere allocazioni N/D F
Funzionalità del linguaggio di base C++17 Supportato
  N4086 Rimozione di trigrammi VS 2010 14
  N3922 Nuove regole per l'automazione con braced-init-list VS 2015 14
  N4051 typename in parametri di modello VS 2015 14
  N4266 Attributi per spazi dei nomi ed enumeratori VS 2015 14
  N4267 Valori letterali carattere u8 VS 2015 14
  N4230 Definizioni di spazi dei nomi annidati VS 2015.3 17
  N3928 static_assert concisa VS 2017 17
  P0184R0 Cicli for basati su intervallo generalizzati VS 2017 14
  P0188R1 Attributo [[fallthrough]] VS 2017 17
  P0001R1 Rimozione della parola chiave register VS 2017 15.3 17
  P0002R1 Rimozione di operator++ per bool VS 2017 15.3 17
  P0018R3 Acquisizione *this per valore VS 2017 15.3 17
  P0028R4 Uso attributo namespaces senza ripetizione VS 2017 15.3 17
  P0061R1 __has_include VS 2017 15.3 14
  P0138R2 direct-list-init delle enumerazioni fisse da numeri interi VS 2017 15.3 17
  P0170R1 Espressioni lambda constexpr VS 2017 15.3 17
  P0189R1 Attributo [[nodiscard]] VS 2017 15.3 17
  P0212R1 Attributo [[maybe_unused]] VS 2017 15.3 17
  P0217R3 Associazioni strutturate VS 2017 15.3 17
  P0292R2 Istruzioni if di constexpr VS 2017 15.3 G
  P0305R1 Istruzioni di selezione con inizializzatori VS 2017 15.3 17
  P0245R1 Valori letterali hexfloat No
  N4261 Correzione delle conversioni di qualificazione No
  N4268 Possibilità di consentire più argomenti di modello non di tipo No
  N4295 Espressioni di riduzione No
  P0003R5 Rimozione di specifiche di eccezione dinamiche No
  P0012R1 Aggiunta di noexcept al sistema di tipi No
  P0017R1 Inizializzazione aggregata estesa No
  P0035R4 Allocazione di memoria dinamica con ulteriore allineamento No
  P0036R0 Rimozione di alcune riduzioni unarie No
   P0091R3 Deduzione dell'argomento del modello per modelli di classe
   P0512R0 Problemi di deduzione dell'argomento del modello di classe
No
  P0127R2 Dichiarazione di parametri di modello non di tipo con auto No
  P0135R1 Elisione copia garantita No H
  P0136R1 Ridefinizione ereditarietà dei costruttori No
  P0145R3 Ridefinizione ordine di valutazione di espressioni
  P0400R0 Ordine di valutazione degli argomenti della funzione
No
  P0195R2 Espansioni pack nelle dichiarazioni using No
  P0283R2 Attributi non riconosciuti ignorati No
  P0386R2 Variabili inline No
  P0522R0 Corrispondenza tra parametri di modello e argomenti compatibili No
  P0702R1 Correzione della deduzione di argomenti del modello di classe per i costruttori di elenchi di inizializzatori No
Funzionalità del linguaggio di base C++20 Supportato
  P0306R4 Aggiunta di __VA_OPT__ per omissione della virgola ed eliminazione della virgola No
  P0329R4 Inizializzazione designata No
  P0409R2 Acquisizione lambda consentita [=, this] No
  P0428R2 Sintassi modello familiare per espressioni lambda generiche No
  P0683R1 Inizializzatori del membro predefinito per campi bit No
  P0704R1 Correzione lvalue const per puntatori a membri con qualificatore ref No
  P0734R0 Concetti No

Funzionalità della libreria standard

Area funzionalità
Funzionalità della libreria standard C++20 Supportato
  P0463R1 endian No
  P0674R1 make_shared() per le matrici No
Funzionalità della libreria standard C++17 Supportato
  P0433R2 Integrazione della deduzione del modello per i modelli di classe nella libreria standard
  P0739R0 Miglioramento dell'integrazione della deduzione degli argomenti dei modelli di classe nella libreria standard
No
  P0607R0 Variabili inline per la libreria standard No
  P0426R1 Constexpr per char_traits No
  P0030R1 hypot (x, y, z) No
  P0033R1 Ridefinizione di enable_shared_from_this No
  P0220R1 Library Fundamentals V1 Parziale J
  P0414R2 shared_ptr<T[]>, shared_ptr<T[N]>
  P0497R0 Correzione shared_ptr per matrici
No
  P0083R3 Splicing mappe e set
  P0508R0 Chiarimento di insert_return_type
No
  P0005R4 not_fn()
  P0358R1 Correzioni per not_fn()
No
  P0067R5 Conversioni di stringhe elementari 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
  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
  P0317R1 Memorizzazione nella cache della voce di directory per file sytem
  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 K
  N4562 Nozioni fondamentali della libreria: ricerca di Boyer-Moore()
  P0253R1 Correzione dei tipi restituiti dal servizio di ricerca
VS 2017 15.3 17
  P0031R0 constexpr per <array> (nuovamente) e <iterator> VS 2017 15.3 17
  P0040R3 Estensione degli strumenti di gestione della memoria VS 2017 15.3 17
  P0084R2 Tipo restituito emplace VS 2017 15.3 17
  P0152R1 atomic::is_always_lock_free VS 2017 15.3 17
  P0154R1 hardware_destructive_interference_size e altre VS 2017 15.3 17
  P0156R2 Ridenominazione della funzione variadic lock_guard come scoped_lock VS 2017 15.3 17
  P0258R2 has_unique_object_representations VS 2017 15.3 L
  P0295R0 gcd(), lcm() VS 2017 15.3 17
  P0298R3 std::byte VS 2017 15.3 17, byte
  P0403R1 UDL per <string_view> ("meow"sv e così via) VS 2017 15.3 17
  P0418R2 Requisiti per atomic compare_exchange memory_order VS 2017 15.3 14
  P0435R1 Revisione di common_type
  P0548R1 Adattamento di common_type e duration
VS 2017 15.3 14
  P0505R0 constexpr per <chrono > (nuovamente) VS 2017 15.3 17
  P0513R0 Hash di poisoning
  P0599R1 Hash noexcept
VS 2017 15.3 14
  P0516R0 Contrassegno copia di shared_future come noexcept VS 2017 15.3 14
  P0517R0 Costruzione di future_error da future_errc VS 2017 15.3 14
  P0558R1 Risoluzione delle incoerenze della classe di base con nome atomic VS 2017 15.3 14
  P0604R0 Modifica di is_callable/result_of in invoke_result, is_invocable, is_nothrow_invocable VS 2017 15.3 17
  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 14
  N4508 shared_mutex (non temporizzata) VS 2015.2 14
  P0004R1 Rimozione di alias iostream deprecati VS 2015.2 rem
  P0006R0 Modelli di variabile per tratti di tipo (is_same_v e altri) VS 2015.2 14
  P0007R1 as_const() VS 2015.2 14
  P0013R1 Tratti di tipo operatore logico (conjunction e altri) VS 2015.2 14
  P0074R0 owner_less<> VS 2015.2 14
  P0092R1 <chrono> floor(), ceil(), round(), abs() VS 2015.2 14
  P0156R0 Variadic lock_guard VS 2015.2 14
  N3911 void_t VS 2015 14
  N4089 Conversioni sicure in unique_ptr<T[]> VS 2015 14
  N4169 invoke() VS 2015 14
  N4190 Rimozione auto_ptr, random_shuffle() ed elementi <functional> precedenti VS 2015 rem
  N4258 Pulizia noexcept VS 2015 14
  N4259 uncaught_exceptions() VS 2015 14
  N4277 reference_wrapper facilmente copiabile VS 2015 14
  N4279 insert_or_assign()/try_emplace() per map/unordered_map VS 2015 14
  N4280 size(), empty(), data() VS 2015 14
  N4366 Assegnazione unique_ptr vincolata con precisione VS 2015 14
  N4389 bool_constant VS 2015 14
  P0063R3 Libreria Standard C11 VS 2015 C11, 14
  N4510 Supporto tipi incompleti in vector/list/forward_list VS 2013 14
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.
VS 2017 15.3 indica le funzionalità supportate in Visual Studio 2017 versione 15.3.

Note

A 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++.
B il supporto del compilatore per la ricerca del nome in due fasi è stato migliorato, ma rimane incompleto.
C Il supporto del compilatore per l'espressione SFINAE è sufficiente per la libreria standard a partire da Visual Studio 2015 Update 2, ma rimane incompleto.
D 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.
E Contrassegnato come non applicabile perché i compilatori sono consentiti, ma non necessari, per supportare i tipi integer estesi. Come GCC e Clang, Microsoft ha scelto di non supportarli.
F Analogamente, questo elemento è contrassegnato come non applicabile perché i compilatori sono consentiti, ma non richiesti, per implementare questa ottimizzazione.
G Supporto disponibile in /std:c + + 14 con un messaggio di avviso che può essere rimosso.
H Questa funzionalità era disponibile nelle anteprime di Visual Studio 2017 versione 15.3, ma è stata rimossa dalla versione rilasciata a causa di bug trovati.
J Le funzionalità che non sono state completate in Visual Studio 2015 sono descritte in dettaglio altrove in questa tabella.
K 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.
L Funzionalità supportata da una funzione intrinseca del compilatore. Questa funzione intrinseca non è ancora disponibile in Clang. La funzionalità è disponibile ma non ancora abilitata in Intellisense.
14 Queste funzionalità C++ 17 sono sempre abilitate, anche quando si specifica /std:c + + 14 (impostazione predefinita). Il motivo è che la funzionalità è stata implementata prima dell'introduzione delle opzioni /std oppure a causa dell'imprevista complessità dell'implementazione condizionale.
17 Queste funzionalità sono abilitate da /std:c++17 (o dall'opzione del compilatore /std:c++latest).
byte std::byte è abilitato da /std:c++17 (o /std:c++latest), ma poiché è in conflitto con le intestazioni di Windows SDK in alcuni casi, dispone di una macro dettagliata per il rifiuto esplicito. Può essere disabilitato definendo _HAS_STD_BYTE come 0.
C11 La libreria CRT universale ha implementato le parti della libreria standard C11 richieste da C++ 17, fatta eccezione per gli identificatori di conversione alternativa E/O strftime() C99, fopen() in modalità esclusiva C11 e aligned_alloc() C11. L'implementazione di quest'ultimo è improbabile, perché C11 specificava aligned_alloc() in un modo non compatibile con l'implementazione Microsoft di free(). In particolare free() deve essere in grado di gestire allocazioni notevolmente allineate.
rem Funzionalità rimosse quando si specifica l'opzione del compilatore /std:c++17 (o /std:c++latest). Per queste funzionalità sono disponibili macro per il rifiuto esplicito: _HAS_AUTO_PTR_ETC, _HAS_FUNCTION_ALLOCATOR_SUPPORT, _HAS_OLD_IOSTREAMS_MEMBERS e _HAS_UNEXPECTED.

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++