Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Sono stati apportati miglioramenti alla conformità e correzioni di bug in ogni versione degli strumenti di compilazione C++ (MSVC) di Microsoft. A partire da Visual Studio 2026 versione 18.0, vengono organizzati i miglioramenti principali in base al numero di versione degli strumenti di compilazione MSVC. Usare i collegamenti In questo articolo nella parte superiore di questo articolo per passare direttamente alle modifiche per una versione specifica.
Per le modifiche apportate alle versioni precedenti di Visual Studio:
| Versione | Collegamento ai miglioramenti della conformità |
|---|---|
| 2022 | Miglioramenti della conformità C++ in Visual Studio 2022 |
| 2019 | Miglioramenti della conformità C++ in Visual Studio 2019 |
| 2017 | Miglioramenti della conformità di C++ in Visual Studio 2017 |
| 2003-2015 | Visual C++: novità dalla versione 2003 alla 2015 |
Miglioramenti della conformità C++, modifiche del comportamento e correzioni di bug in MSVC Build Tools v14.51
MSVC Build Tools v14.51 continua l'avanzamento verso la conformità di C++23 con diverse implementazioni delle funzionalità del linguaggio chiave e numerose risoluzioni dei problemi di Core Working Group (CWG). Questa versione è incentrata sui miglioramenti della valutazione in fase di compilazione, sui miglioramenti del supporto Unicode e sulla gestione perfezionata consteval .
Questa versione è stata fornita per prima con Visual Studio 2026 versione 18.6 e include la versione 19.51 del compilatore MSVC.
Le principali evidenziazioni di questa versione includono:
- Variabili statiche
constexprnelleconstexprfunzioni (P2647R1) - Restrizioni rilassate
constexpr(P2448R2) - Miglioramenti del supporto Unicode (P2029R4, P2071R2, P2314R4)
- Miglioramento
constevaldella gestione delle funzioni con funzionalità sperimentali abilitate per impostazione predefinita - Nuovi header della libreria standard
<flat_map>e<flat_set>
Per altre informazioni sulle funzionalità della libreria e altri aggiornamenti, vedere Supporto di C++23 in MSVC Build Tools 14.51 e Log modifiche STL.
P2647R1: variabili constexpr statiche nelle funzioni constexpr
P2647R1 consente di dichiarare constexpr variabili locali statiche all'interno di funzioni, riducendo l'attrito constexpr quando si contrassegnano le funzioni esistenti come constexpr.
constexpr char xdigit(int n)
{
static constexpr char digits[] = "0123456789abcdef";
return digits[n];
}
Questa funzionalità migliora sia la valutazione in fase di compilazione che l'ottimizzazione in fase di esecuzione. In precedenza, le variabili locali statiche non potevano essere contrassegnate constexpr, che rendevano difficile dichiarare tabelle di ricerca all'interno constexpr delle funzioni. Ora il compilatore può valutare queste funzioni in fase di compilazione quando possibile, generando anche codice di runtime ottimizzato che accede direttamente all'archiviazione statica.
Altre funzionalità di C++23
Altre funzionalità di C++23 implementate in questa versione includono miglioramenti del supporto Unicode, etichette alla fine delle istruzioni composte per la compatibilità C, la deduzione degli argomenti del modello di classe (CTAD) dai costruttori ereditati e esportazioni significative per i moduli. Per altre informazioni e le relative risoluzioni dei problemi di Core Working Group (CWG), vedere il supporto di C++23 in MSVC Build Tools 14.51.
Libreria standard
MSVC Build Tools v14.51 aggiunge nuove funzionalità della libreria standard, tra cui:
- intestazioni
<flat_map>e<flat_set> - Tratti di tipo per rilevare i riferimenti associati a oggetti temporanei (P2255R2)
- Gestione esplicita del ciclo di vita (P2590R2) e
is_implicit_lifetime(P2674R1). - Importante revisione
<regex>, algoritmi STL vettorizzati SIMD che usano NEON per ARM64/ARM64EC e risoluzioni di 18 problemi del Library Working Group (LWG). Per l'elenco completo, vedere il log delle modifiche STL.
Miglioramenti della conformità C++, modifiche del comportamento e correzioni di bug in MSVC Build Tools v14.50
MSVC Build Tools v14.50 introduce miglioramenti al compilatore MSVC e alla libreria standard, tra cui una migliore conformità agli standard C++23, un'affidabilità avanzata e una maggiore correttezza. Questa versione include anche numerose correzioni di bug e aggiornamenti che traggono vantaggio per lo sviluppo C++ su larga scala.
Questa versione è stata fornita prima con Visual Studio 2026 versione 18.0 e include la versione 19.50 del compilatore MSVC.
Le principali evidenziazioni di questa versione includono:
- Supporto avanzato delle funzionalità C++23, tra cui
auto(x)decay-copy e#warningdirettiva. - Miglioramenti completi
constexpr, in particolare per le funzioni virtuali. - Miglioramenti principali della stabilità per i moduli C++.
- Correzioni complete di affidabilità che riducono gli errori interni del compilatore.
- Supporto avanzato di C++/CLI per scenari di codice gestito.
- La libreria standard Microsoft C++ (MSVC STL) non supporta più la destinazione Windows 7/Server 2008 R2, Windows 8/Server 2012 o Windows 8.1/Server 2012 R2.
- Windows 10/Server 2016 sono i sistemi operativi minimi supportati.
Per ulteriori informazioni sui miglioramenti delle prestazioni, sulle correzioni di bug e sugli aggiornamenti di conformità nella libreria standard, vedere il Changelog STL, che viene aggiornato regolarmente.
Funzionalità di C++23
MSVC Build Tools v14.50 aggiunge il supporto per diverse funzionalità di C++23, rendendo il compilatore più vicino alla conformità completa di C++23.
P0849R8: auto(x) - copia per decadimento nella lingua
P0849R8 introduce la sintassi auto(x) per le operazioni di copia-decadenza direttamente nel linguaggio, offrendo un modo più conciso per esprimere la semantica della copia-decadenza.
Prima di P0849R8, è necessario eseguire in modo esplicito le operazioni di decadimento:
// Before P0849R8:
void pop_front_alike(auto& x)
{
using T = std::decay_t<decltype(x.front())>;
std::erase(x, T(x.front()));
}
Dopo P0849R8, è possibile usare la sintassi più semplice auto(x) :
// After P0849R8:
void pop_front_alike(auto& x)
{
std::erase(x, auto(x.front()));
}
Questa funzionalità offre un modo standardizzato per eseguire operazioni di copia-decay, rendendo il codice più leggibile e riducendo la necessità di metaprogrammazione dettagliata di template.
P2437R1: direttiva C++23 #warning
P2437R1 implementa la direttiva del preprocessore C++23 #warning , fornendo un modo standard per generare avvisi durante la compilazione.
// Valid before C++23.
#error bad configuration...
// Valid after C++23.
#warning configuration deprecated...
La #warning direttiva consente di generare messaggi di diagnostica senza arrestare la compilazione, rendendola utile per avvisi di deprecazione e avvisi di configurazione. Per altre informazioni, vedere direttiva #warning (C/C++).
Problema CWG 2586: parametro di oggetto esplicito per l'assegnazione e il confronto
Il problema CWG 2586 consente parametri di oggetto espliciti negli operatori di assegnazione e confronto, abilitando definizioni di operatori più flessibili.
struct S
{
S& operator=(this S&, const S&) = default; // Valid after CWG2586.
auto operator<=>(this const S&, const S&) = default; // Valid after CWG2586.
};
Questa modifica consente di usare la sintassi esplicita dei parametri oggetto (deducendo this) negli operatori di assegnazione e confronto, fornendo una sintassi più coerente tra diversi tipi di funzioni membro.
P2266R1 : spostamento implicito più semplice
L'introduzione di P2266R1 potrebbe far sì che il codice precedentemente trattato come un lvalue venga ora interpretato come un xvalue o prvalue. Per esempio:
#include <utility>
template<typename T>
T& f(T&& t)
{
return t;
}
struct S { };
void g()
{
S s1{ };
S& s2 = f(std::move(s1));
}
In C++20 e versioni precedenti, questo codice veniva compilato perché, anche se il tipo di t è S&&, l'uso di t in return t viene considerato come un glvalue e quindi può essere associato al tipo di ritorno.
Con C++23, t viene considerato come xvalue e quindi non può essere associato a un riferimento lvalue.
Una correzione consiste nel modificare il tipo restituito della funzione da T& a T&& , ma ciò può influire sul codice che chiama questa funzione. Un'alternativa consiste nell'usare la macro di test delle funzionalità associata a questa modifica. Per esempio:
#include <type_traits>
template<typename T>
T& f(T&& t)
{
#if defined(__cpp_implicit_move)
return static_cast<std::remove_reference_t<T>&>(t);
#else
return t;
#endif
}
L'aggiunta del cast indica che la categoria valore dell'espressione restituita è ora un lvalue e quindi può essere associata al tipo restituito.
P2280R4: riferimenti a valori sconosciuti durante la valutazione costante
P2280R4 consente riferimenti a valori sconosciuti durante la valutazione costante, allentando le restrizioni sulla constexpr valutazione.
template <typename T, size_t N>
constexpr size_t array_size(T (&)[N])
{
return N;
}
void check(int const (¶m)[3])
{
constexpr auto s2 = array_size(param); // Previously ill-formed, now accepted as a constant expression after P2280R4.
}
Questo miglioramento consente di valutare più codice in fase di compilazione, in particolare quando si gestiscono parametri di funzione nei contesti di modello.
Miglioramenti della conformità
Una migliore conformità agli standard C++ include una migliore gestione di attributi, modelli e funzionalità C++20/C++23.
Supporto degli attributi
- Aggiunto supporto per
[[maybe_unused]]sulle etichette. - Correzione dell'avviso C4102 (etichetta senza riferimenti) quando l'unico riferimento proviene da un ramo rimosso
if constexpr.
Correzioni di modelli e specializzazioni
- Identificate specializzazioni esplicite friend malformate che sono state erroneamente accettate in C++20 o versioni successive.
- Aggiunta dell'interruttore
per codificare correttamente i parametri di template enum non di tipo . - Correzione dei problemi relativi alla diagnostica delle parole chiave 'template' mancante
Funzionalità di C++20 e C++23
-
Supporto multidimensionale
operator[]avanzato - Miglioramento del concetto e della valutazione dei vincoli
Aggiornamenti di conformità più piccoli
MSVC Build Tools v14.50 include numerosi miglioramenti di conformità più piccoli che migliorano la conformità standard C++:
- CWG2635: supporto per associazioni vincolate strutturate
- CWG2465: miglioramenti ai parametri coroutine passati al costruttore di promise
- CWG2496: qualificatori di riferimento e correzioni di sovrascrittura virtuale
- CWG2506: binding strutturati e correzioni cv-qualificatori di matrice
-
CWG2507: argomenti predefiniti per il supporto di
operator[] - CWG2585: Allineamento del comportamento con i requisiti standard
- CWG2521: Obsolescenza di 'operator string-literal identifier'
- CWG2528: regole di conversione rilassate per l'operatore spaceship
- P2360R0: definizione di istruzione init estesa per consentire dichiarazioni alias
- P2290R3: Supporto della sequenza di escape delimitata da C++23 esadecimale/ottale nei valori letterali stringa
- P2797R0: Risoluzione per CWG2692 riguardo le funzioni membro statiche ed esplicite degli oggetti, con lo stesso elenco di tipi di parametri.
- P2266R3: semantica di spostamento implicita più semplice
Correzioni di bug
Sono state apportate correzioni di bug per i moduli C++ constexpr, e altre correzioni in MSVC Build Tools v14.50.
Per un elenco dettagliato delle correzioni di bug, vedere Miglioramenti del compilatore nella versione 14.50.
Correzione della codifica di determinati argomenti di modello non di tipo
Influisce /std:c++20 o versione successiva.
Alcuni argomenti del modello di tipo puntatore non tipi che coinvolgono oggetti secondari potrebbero causare problemi di collegamento o in alcuni casi generazione di codice non valido invisibile all'utente in cui si verificano conflitti di specializzazioni distinte.
struct A
{
int x;
};
struct B
{
int y;
};
template <auto p> void f();
int main()
{
static A a;
static B b;
constexpr auto px = &a.x;
constexpr auto py = &b.y;
f<px>(); // incorrect encoding of argument 'px'
f<py>(); // incorrect encoding of argument 'py', collided with 'px'.
}
Con questa correzione, le due chiamate per f ottenere codifiche distinte, come richiesto.
Migrazione a MSVC Build Tools v14.50
Quando si esegue l'aggiornamento a MSVC Build Tools v14.50, prendere in considerazione le seguenti potenziali modifiche di rilievo e indicazioni sulla migrazione:
Adozione delle funzionalità di C++23
- Aggiorna il codice per sfruttare la nuova
auto(x)sintassi decay-copy per un codice template più pulito. - Prendere in considerazione l'uso
#warningdi direttive per gli avvisi di deprecazione anziché la compilazione condizionale soggetta a errori - Esaminare l'utilizzo esplicito dei parametri oggetto negli operatori per migliorare la coerenza
constexpr miglioramenti
- Il codice esistente
constexprpuò ora compilare che in precedenza non è riuscito, in particolare con le funzioni virtuali - Esaminare il codice di valutazione costante per individuare potenziali nuove opportunità di ottimizzazione
- Aggiornare i modelli CRTP che ora possono funzionare correttamente con i membri constexpr statici
Migrazione dei moduli
- I progetti che usano moduli C++20 dovrebbero vedere una maggiore stabilità e compatibilità
- Le unità di intestazione ora funzionano in modo più affidabile con codebase di grandi dimensioni come Unreal Engine 5
- Valutare la possibilità di eseguire la migrazione dalle intestazioni tradizionali ai moduli per migliorare le prestazioni di compilazione
Diagnostica del compilatore
- È possibile che vengano visualizzati nuovi avvisi per i problemi non diagnosticati in precedenza
- Verificare l'utilizzo del tipo enum se si usa
/Zc:enumTypes - Aggiornare il codice che si basa sulle conversioni implicite che potrebbero ora essere contrassegnate
Aggiornamenti del codice C
- Le funzionalità C23 sono disponibili con
/std:clatest -
typeofle modifiche del comportamento possono influire sul codice esistente - Esaminare l'utilizzo del preprocessore per la nuova
__VA_OPT__disponibilità
Inviare commenti
Per gli aggiornamenti più recenti e per fornire commenti e suggerimenti, visitare la community degli sviluppatori di Visual Studio o contattare il team all'indirizzo visualcpp@microsoft.com. Seguici su X @visualc o BlueSky @msftcpp.bsky.social.
Se si verificano problemi con MSVC in Visual Studio 2026, segnalarlo tramite l'opzione Segnala un problema , dal programma di installazione o dall'IDE di Visual Studio stesso.
Vedere anche
Conformità del linguaggio Microsoft C/C++
Novità di C++ in Visual Studio
Miglioramenti della conformità C++ in Visual Studio 2022