Komiteti ISO për standardizimin e gjuhës C++ standardin ndërkombëtar "". Mundësitë e paraqitura në specifikim, me përjashtim të rasteve të vetme, në kompilatorët , dhe . Bibliotekat standarde që mbështesin C++20 janë realizuar në kuadër të projektit .
Në dy muajt e ardhshëm, specifikimi i miratuar do të jetë në fazën e përgatitjes së dokumentit për botim, ku do të punohet në redaktimin e gabimeve ortografike dhe shtypore. Në fillim të nëntorit, versioni rezultat i dokumentit do të dërgohet në ISO për publikim me emrin formal ISO/IEC 14882:2020. Ndërkohë, komiteti ka filluar tashmë punën për standardin e ardhshëm C++23 (C++2b) dhe në takimin e tij virtual të afërt do të shqyrtojë possible .
():
- Janë shtuar "konceptet", zgjerimi i shabllonëve që lejon përcaktimin e një seti kërkesash për parametrat e shabllonëve, të cilat gjatë kompollimit kufizojnë grupin e argumenteve që mund të pranohen si parametra shablloni. Konceptet mund të aplikohen për të shmangur pasgjegjësi logjike midis pronave të llojeve të dhënash që përdoren brenda shabllonit dhe pronave të llojeve të dhënash të parametrave të hyrjes.
template
concept EqualityComparable = requires(T a, T b) {
{ a == b } -> std::boolean;
{ a != b } -> std::boolean;
}; - Në përbërje përfshihet për të punuar me modulet, të cilat mund të përdoren si zëvendësues për skedarët e titujve. Modulet ofrojnë një mënyrë të re për organizimin e teksteve burimore mbi bazën e përcaktimit të kufijve të komponentëve, pa skedarët e titujve që lidhen përmes "#include".
- Makro __VA_OPT__ për zbulimin e adaptiv të makrove variative në varësi të pranisë së tokenëve në argumentin variativ.
- Mbështetje për operatorin "" për krahasimin e treanshëm.
- Mbështetje për inicializatorët e elementeve me vlera të paracaktuara për fushat e bitëve.
- Mundësia e kapjes së shprehjeve "*this" në lambda.
struct int_value {
int n = 0;
auto getter_fn() {
// BAD:
// return [=]() { return n; };// GOOD:
return [=, *this]() { return n; };
}
}; - Thirrja e elementeve përmes treguesit (Pointer-to-member), duke përdorur tregues të përcaktuar përmes shprehjes "const &" për objekte përkohshme.
- Operatori delete me destruktues, i përshkruar në dokumentin .
- Klasat janë lejuar të përdorin parametra shablloni pa lloj.
struct foo {
foo() = default;
constexpr foo(int) {}
};template
auto get_foo() {
return f;
}get_foo(); // përdor konstruktorin implicit
get_foo(); - Shprehje lambda të papërfillshme me constructor.
- Lejueshmëria e përdorimit të sintaksës së shablloneve për shprehjet lambda («auto f = [](std::vector v)»).
- Mundësia e përdorimit të literalëve të vargjeve në parametrat e shabllonit.
- MbĂ«shtetje pĂ«r sintaksĂ«n e inicializimit nĂ« stilin C â fusha tĂ« pa pĂ«rmendura nĂ« listĂ«n e inicializimit inicializohen me vlera me default.
struct A {
int x;
int y;
int z = 123;
};A a {.x = 1, .z = 2}; // a.x == 1, a.y == 0, a.z == 2
- Mbështetje për anëtarët e zbrazët të strukturave të dhënash.
- Mbështetje për atributet likely dhe unlikely për të informuar optimizuesin për probabilitetin e përsëritjes së një ndarje të kushtëzuar («[[likely]] if (random > 0) {«).
- Mundësia e përdorimit të intervaleve për inicializimin e vlerave të variablit në ciklin «for»
for (auto v = std::vector{1, 2, 3}; auto& e : v) {
- Kalkulimi automatik i madhësisë së array në new («new double[]{1,2,3}»);
- Atributi «[[no_unique_address]]» ku variablat pa të dhëna nuk zënë hapësirë.
- Pointerat atomikë (std::atomic<shared_ptr> dhe std::atomic<weak_ptr>).
- Mundësia e thirrjes së funksioneve virtuale në shprehjet kushtetuese.
- Mbështetje për funksione të shpejta (immediate), të cilat mund të punojnë vetëm me konstante.
consteval int sqr(int n) {
return n * n;
}constexpr int r = sqr(100); // OK
int x = 100;
int r2 = sqr(x); // ERROR: âxâ nuk mund tĂ« pĂ«rdoret si konstante - MundĂ«sia e aplikimit tĂ« constexpr me funksione virtuale («constexpr virtual int f() const { return 2; }»).
- Në bibliotekën standarde:
- Shtuar mbështetje për tipin char8_t për vargjet UTF-8.
- Shtuar skedarët e kokës bit (operacionet mbi bitë) dhe version.
- Kjo mundëson kontrollin e prefikseve dhe sufikseve të vargjeve (starts_with, ends_with).
- Shtuar tipazhe std::remove_cvref, std::unwrap_reference, std::unwrap_decay_ref, std::is_nothrow_convertible dhe std::type_identity.
- Shtuar funksionet std::midpoint, std::lerp, std::bind_front, std::source_location, std::visit, std::is_constant_evaluated dhe std::assume_aligned.
- Në std::make_shared është shtuar mbështetje për array.
- Shtuar funksioni std::to_array për të konvertuar objekte të ngjashme me array në std::array.
- Sintaksë më e përshtatshme për enumerat:
enum class rgba_color_channel { red, green, blue, alpha };
std::string_view to_string(rgba_color_channel my_channel) {
switch (my_channel) {
using enum rgba_color_channel;
case red: return «red»;
case green: return «green»;
case blue: return «blue»;
case alpha: return «alpha»;
}
} - NĂ« indekset e ndaluar pĂ«r shkak tĂ« sjelljes sĂ« paqartĂ« pĂ«rdorimi i operacionit «,» («a[b,c]»). ĂshtĂ« ndĂ«rprerĂ« mbĂ«shtetje pĂ«r shumicĂ«n e operacioneve me variablat e shpallur me fjalĂ«n kyçe volatile, pĂ«rfshirĂ« ndalimin e operacioneve «++» dhe «â» me llojet standarde.
- Numri i situatave ku nevojitet tregimi i «typename» për të informuar për praninë e një tipi është reduktuar.
Burimi: opennet.ru
