Microsoft izlaida MSVC Build Tools 14.52 laidiena kandidātu. Karodziņš /std:c++23 tajā vairs nav atzīmēts kā eksperimentāls, tāpēc C++23 valodas režīms Microsoft kompilatorā tagad paredzēts lietošanai ražošanā. Kompilatora versijas cl.exe un link.exe ir vismaz 14.52.37025 jeb 19.52.37025. Kandidāts pieejams caur Visual Studio 2026 Insiders kanālu. Par to paziņoja C++ komandas blogs 15. oktobrī.
Šis ir pēdējais 14.52 priekšlaidiens pirms stabilās versijas. Stabilais 14.52 gaidāms novembrī. Tas iznāks kopā ar Visual Studio 18.12 Stable kanālā.
Ko nozīmē gatavs ražošanai
Līdz šim C++23 atbalsts MSVC bija pieejams tikai ar atsevišķu priekšversijas karodziņu. Tagad /std:c++23 ieslēdz pilnu C++23 valodas režīmu bez priekšversijas atrunas. Vecais pareizrakstījums /std:c++23preview joprojām darbojas kā /std:c++23 aizstājvārds. Taču tas ir novecojis un kādā nākamā laidienā tiks noņemts.
Praktiski statusa maiņa noņem argumentu, ko komandas izmantoja pret C++23 ieviešanu ražošanā. Priekšversijas karodziņš nozīmēja, ka Microsoft neuzņēmās pilnu atbalsta saistību. Projekti ar stingrām piegādes prasībām tāpēc palika pie C++20. Tagad fiksēts /std:c++23 režīms piešķir šo valodas versiju tādā pašā statusā kā iepriekšējās.
Arī standarta bibliotēka sasniedz robežu. Ar priekšlikumu P0533R9 STL kļūst C++23 ziņā pilnīga: constexpr tiek pievienots galvenēm <cmath> un <cstdlib>. Tātad kompilēšanas laikā izpildāmu matemātiku principā var rakstīt tieši standarta bibliotēkā.
Microsoft to formulē vienkārši: C++23 ir gatavs lietošanai ražošanā un pieejams caur karodziņu
/std:c++23.
Ko C++23 pievieno valodai
C++23 pats par sevi nav liels standarts, taču tajā ir vairākas praktiskas lietas. Pie valodas izmaiņām pieder deducing this (skaidrs objekta parametrs metodēm) un daudzdimensiju indeksēšana ar operator[]. Standarta bibliotēka iegūst std::expected kļūdu apstrādei bez izņēmumiem, std::print un std::println formatētai izvadei, kā arī std::mdspan daudzdimensiju skatiem uz atmiņu. Līdz šim MSVC šīs lietas piedāvāja aiz priekšversijas karodziņa. Tagad tās pieejamas stabilā režīmā.
constexpr cmath joprojām izslēgts pēc noklusējuma
Viens caurums paliek. Zem /std:c++23 kompilēšanas laika <cmath> funkciju atbalsts pēc noklusējuma ir izslēgts. To ieslēdz ar karodziņu /Zc:cmath. Microsoft norāda, ka Clang un EDG priekšgalu atbalsts šajā jomā sekos vēlāk.
Pat ar /std:c++latest /Zc:cmath dažas funkcijas joprojām nav constexpr, jo tās trūkst LLVM-libc bibliotēkā. Pie tādām pieder acosh, asinh, atanh, cosh, sinh, tanh un erf tipam double. Tāpat constexpr nav erfc, lgamma un tgamma ne float, ne double variantā. Kas šīs funkcijas sagaida kompilēšanas laikā, tam pagaidām jāraksta pašam.
Kompilēšanas laika matemātika palīdz tur, kur vērtības var aprēķināt iepriekš. Piemērs ir uzmeklēšanas tabulas, ko kompilators ieraksta tieši binārajā failā, lai izvairītos no aprēķiniem programmas darbības laikā. Tāpēc atruna par /Zc:cmath svarīga tiem projektiem, kas šādas tabulas veido ar standarta bibliotēkas funkcijām. Pārējiem noklusējuma uzvedība neko nemaina.
Citas C++23 iespējas, kas tagad ieslēgtas
Kopā ar laidiena kandidātu ieslēdzas vēl vairākas C++23 funkcijas:
- Tūlītēja eskalācija (P2564R3) darbojas C++23 un jaunākos režīmos. C++20 būvējumos to var ieslēgt ar
/Zc:immediateEscalation. - Unicode identifikatoru matemātiskie diapazoni (P3658R1) ir pieejami C++23 un C23 režīmos.
- Karodziņš
/clrjauktajam pārvaldītajam kodam tagad strādā arī C++23 un jaunākos režīmos.
Tūlītējā eskalācija (P2564R3) maina to, kā kompilators apstrādā constexpr funkcijas, kuras izsauc consteval funkciju. Agrāk šāds kods bieži nekompilējās bez papildu atzīmēm. Tagad parasta constexpr funkcija vajadzības gadījumā pati kļūst par tūlītēju funkciju. C++20 projektiem šo uzvedību ieslēdz ar /Zc:immediateEscalation.
Šīs izmaiņas skar tieši tos projektus, kas jau tagad būvējas ar /std:c++latest un gatavojas pāriet uz fiksētu C++23 režīmu bez priekšversijas karodziņa. Komandām, kas migrē no C++20, vērts pārbaudīt būvējumu ar jauno karodziņu jau kandidāta posmā. Tā problēmas ar __cpp_constexpr vai citiem makro atklājas pirms novembra stabilā laidiena.
Kā tas iekļaujas laika grafikā
C++23 atbalsts MSVC pirmoreiz parādījās 14.51 priekšversijā šā gada aprīlī, kad to aprakstīja tas pats C++ komandas blogs. Toreiz režīms bija priekšversijas statusā. 14.52 kandidāts to pārceļ uz ražošanas statusu un slēdz STL pusi ar P0533R9.
GCC un Clang C++23 režīmu ar karodziņu -std=c++23 piedāvā jau vairākus laidienus. MSVC šajā ziņā bija pēdējais no trim lielajiem kompilatoriem, kam C++23 palika aiz priekšversijas atzīmes. Līdz ar 14.52 šī atšķirība izzūd. Komandas, kas būvē vienu kodu ar visiem trim kompilatoriem, var atmest Microsoft specifisko priekšversijas karodziņu no sava būvēšanas skripta.
Ne viss ir gluds. Bloga komentāros izstrādātāji norāda, ka versija 19.52.37025 C++23 režīmā makro __cpp_constexpr joprojām definē kā 202002L, nevis kā C++23 atbilstošu vērtību. Microsoft pašā ierakstā to nepiemin. Praksē tas nozīmē, ka kods, kas pārbauda šo makro, var nepamanīt jaunās constexpr iespējas.
Stabilais 14.52 ar visām šīm izmaiņām gaidāms novembrī kopā ar Visual Studio 18.12.
Komentāri
Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.