Ez a szakasz tudatosan nem ismétli meg a fő kurzus anyagát (lásd C++23 összefoglaló és migrációs táblázat (46.1)), és nem állítja, hogy bármelyik alábbi képesség elérhető. Célja egy státusz-ellenőrzési keretrendszer és egy elsődleges forrásokhoz vezető térkép adása, amelyet a generálás, illetve az olvasás napján aktuális WG21- és compiler-/library-forrásokból kell kitölteni. A C++26 egészének státuszát a forrásjegyzék [C++26] tétele rögzíti (2026-10-25: technikailag lezárt, DIS-szavazáson, ISO-kiadás nem igazolt), az egyes könyvtári képességekét pedig a C++26 könyvtári és konkurencia-kitekintés táblázata. Az itt szereplő, C++26 utáni irányok konkrét státusza viszont nem ellenőrzött, kitöltendő mező, nem pedig tényállítás; a lenti sablon ennek kitöltésére szolgál.
A C++ ökoszisztémában egy új képesség élete több, egymástól szigorúan megkülönböztetendő állapoton halad át, és a gyakorlati döntéseknél a négy szintet nem szabad összemosni.
__cpp_lib_*,
__cpp_*) és compiler-státuszoldalak alapján kell
ellenőrizni, nem a javaslat szövege alapján.Ezért a helyes kérdés sosem az, hogy „benne van-e C++26-ban?”, hanem az, hogy melyik szinten áll, melyik revízión, melyik konkrét compiler/library párosítással, és mikor ellenőriztük.
A státuszt csak forrással és dátummal szabad megjelölni. A szakaszhoz használható táblázatsablon a következő; az első három oszlopot a tanulónak kell kitöltenie elsődleges forrásból, a negyedik az, amit a szöveg megenged.
| Képesség (terület) | Szint: proposal / draft / ISO / implementált | Elsődleges forrás azonosítója (P-/N-szám, oldal, szakasz) | Ellenőrzés dátuma | Megjegyzés (korlát) |
|---|---|---|---|---|
| Reflection / compile-time generálás | kitöltendő | kitöltendő | kitöltendő | Nem helyettesíti a fordító támogatását |
| Contracts | kitöltendő | kitöltendő | kitöltendő | Runtime/diagnosztika szemantika a draft szerint |
std::execution sender/receiver |
kitöltendő | kitöltendő | kitöltendő | Library-támogatás külön ellenőrizendő |
| Hazard pointer / RCU reclamation | kitöltendő | kitöltendő | kitöltendő | A shared_ptr alternatívája, nem cseréje |
| SIMD / linear algebra | kitöltendő | kitöltendő | kitöltendő | Header- és standard library-függés |
A „szint” oszlopban csak a fenti négy kategória egyike állhat; a
forrásokhoz elsődleges anyagot (WG21 papers, working draft,
compiler-/stdlib-dokumentáció, ABI-specifikáció) kell használni, nem
blogbejegyzést vagy összefoglalót. A tarisznyába kerülő
source_id-k helyére itt a konkrét P-/N-jelölést és a
megtalálás dátumát kell írni.
A reflection (tükrözés) célja, hogy a program a saját típusait és tagjait compile time enumerálhatóvá tegye, és erre építve generikus szerializációt, ORM-et, teszteket lehessen írni kézi felsorolás nélkül. A C++20-as alap ezt makrókkal és sablonmanipulációval utánozza.
// serialize_cxx20.cpp — C++20 baseline: kézi felsorolás
#include <cstdio>
struct Point { int x; int y; };
// A mezőket kézzel kell megismételni: ez az a terület,
// amit a reflection a jövőben kiválthat.
void dump(const Point& p) {
std::printf("{x=%d, y=%d}\n", p.x, p.y);
}
int main() {
Point p{1, 2};
dump(p);
return 0;
}# Fordítási parancs (a tanuló laborjában ellenőrizendő):
g++ -std=c++20 -O2 -Wall -Wextra serialize_cxx20.cpp -o serialize_cxx20Ez a kód a C++20 alapszabályok szerint állítja össze a kimenetet; a
reflection-javaslat megjelenési formája (API-nevek, metaobjektum-típus,
iteráció módja) revíziónként változhat, ezért nem tanácsos előre
rögzített szintaxist feltételezni. Ha a szakaszhoz később
reflection-példát illesztünk, a -std=c++26 kapcsoló és a
hozzá tartozó compiler-státusz ellenőrzése csak a working draft szintjén
értelmezhető; ezt tilos verziófüggetlen garanciaként olvasni.
A contracts célja: előfeltétel, utófeltétel és invariáns deklaratív
rögzítése úgy, hogy a diagnosztikai és runtime-szemantikát a szabvány
definiálja, ne az adott assert-implementáció. A C++20-as
alap: assert, [[likely]],
std::abort, illetve saját invariant-ellenőrző makrók. A
contracts szövegében a semantics (mikor értékelődik a
predikátum, mi történik megsértés esetén, hogyan viszonyul a
noexcept-hoz) a kritikus pont, mert ez határozza meg, hogy
a kód viselkedése hogyan módosul debug- és release-profilban. A pontos
megfogalmazás a working draftból ellenőrizendő, és az implementációs
támogatás compilerenként eltér.
std::execution
sender/receiverA sender/receiver modell az asszinkron végrehajtást egy
kompozicionálható pipeline-nyá teszi: a munka leírása (sender) elkülönül
a futtatástól (scheduler), és a hibakezelés, megszakítás, több
erőforrás-típus egyetlen típusrendszerbe kerül. A C++20-as alap a
std::future/std::async és kézi szálkezelés,
amelyek a pipeline-szemantikát csak egyedi megoldásokkal közelítik. A
szakaszhoz ezért a C++20-as mintát mutatjuk meg, a sender/receiver
formát csak a working draft alapján, jelöléssel.
// baseline_async.cpp — C++20: std::future, mint a sender/receiver előtti alap
#include <future>
#include <cstdio>
int compute() { return 42; }
int main() {
std::future<int> f = std::async(std::launch::async, compute);
std::printf("%d\n", f.get());
return 0;
}g++ -std=c++20 -O2 -Wall -Wextra -pthread baseline_async.cpp -o baseline_asyncA példa a meglévő alapot mutatja. A sender/receiver bevezetése ezt a felületet nem helyettesíti azonnal; a library implementáció és a standard library-ben elérhető komponensek köre külön ellenőrizendő. A konkurens élettartam és reclamation kérdései a shared ownership, reclamation és konkurens review (34.6) szakaszra épülnek, ahol az ownership-szerződés pontosabb.
A lock-free adatszerkezetekben a legnehezebb kérdés nem a mutáció,
hanem a biztonságos visszanyerés (reclamation): mikor
szabad egy csomópontot felszabadítani, ha egy olvasó még mutat rá. A
C++20-ban erre a std::shared_ptr az egyetlen szabványos, de
atomi referenciaszámítás miatt költséges válasz. A hazard pointer és az
RCU ennél olcsóbb alternatívák; a hozzájuk tartozó library-eszközök
státusza a working draftban és az implementációkban külön ellenőrizendő.
A választás nem helyettesíthető: a shared_ptr továbbra is a
helyes alap, ha az ownership megosztott, és a reclamation-költség nem
kritikus.
A SIMD (single instruction, multiple data) típusok célja, hogy a
vektoros hardveres párhuzamosságot hordozhatóan, típusosan lehessen
kihasználni, a kézi intrinsics és az __m128-család helyett.
A linear algebra (mátrix-, vektor-műveletek) célja, hogy a numerikus kód
standard könyvtári alapot kapjon, és a BLAS/LAPACK-függést hordozható
réteg váltsa fel. A két terület státusza eltér: a SIMD típusok nyelvi
magas szintű leírása és a linear algebra library-felülete külön
P-/N-anyagokban követhető, és mindkettő implementációs támogatása külön
ellenőrizendő. A jelen szakasz csak a térképet adja: a részletes
könyvtári választást a Standard könyvtári
lefedettség és ökoszisztéma-térkép (46.4) tárgyalja.
A legfontosabb félreértés, hogy egy P-számú dolgozat vagy egy N-számú working draft azonos a kiadott szabványos szöveggel. A különbség nem formális: az ISO-szavazás szerkesztheti a szöveget, a nemzeti adaptáció eltérhet, és a working draft egy adott pillanat pillanatképe, amelybe későbbi javaslatok már bekerülhettek, illetve korábbiak kikerülhettek. Ezért a „C++26-ban van” állítás csak a keletkezés dátumával és a hivatkozott konkrét N-/ISO-számmal együtt érvényes. Ha a kurzus bármely fejezetében egy képességre hivatkozunk, a hivatkozást a keletkezés dátumához és a konkrét draft-kiadáshoz kell kötni.
shared_ptr „kiváltása”: a hazard
pointer/RCU a megosztott tulajdonlás alternatívája csak ott, ahol a
reclamation-költség kritikus és az ownership-szerződés ezt
megengedi.A C++26 és későbbi irányok tárgyalásakor a kérdés nem az, hogy „benne van-e a szabványban”, hanem az, hogy melyik szinten (proposal / working draft / ISO / implementált), melyik revízión, melyik forrásból és melyik dátummal ellenőriztük. A fejezet öt területe (reflection, contracts, sender/receiver, hazard pointer/RCU, SIMD és linear algebra) mindegyike a working draft és a compiler-/library-státusz együttes vizsgálatát igényli; egyik sem helyettesíti a fő kurzus C++20-as alapját, és egyik sem garantálható verziófüggetlenül. A státuszkategóriák és a táblázatsablon biztosítják, hogy a későbbi átdolgozások a konkrét forráshoz és dátumhoz köthetők legyenek.
Egy kollégád azt állítja: „a contracts támogatott C++26-ban, tehát a
g++ -std=c++26 lefordítja”. Fogalmazd meg, milyen szint- és
bizonyítékhiányt tartalmaz ez az állítás, és sorolj fel legalább három
ellenőrzési lépést.
Egészítsd ki a serialize_cxx20.cpp példát úgy, hogy a
dump függvény egy Point tömböt is kezeljen, és
a buildparancsot add meg. A kód a C++20 alapszabályok szerint
forduljon.
Válaszd ki a fejezet öt területe közül a
std::execution-t, és készíts egy táblázatsort a „forrás és
dátum” sablon szerint. Add meg, hogy mely feature-test makrót
(__cpp_lib_*) fogsz ellenőrizni, és miért nem elegendő a
P-dolgozat hivatkozása.
Az állítás két szintet mos össze: az „elfogadva C++26-ra” a
working draft szintjét érinti, nem a közzétett
ISO szabvány szintjét, és nem bizonyítja az
implementációs támogatást. A -std=c++26
kapcsoló léte sem garancia arra, hogy a contracts szemantikája a
választott compilerben megfelel a draftnak. Ellenőrzési lépések: (a)
keresd meg a contracts-javaslat pontos P-számát és azt, hogy melyik
working draft-kiadásba került be, dátum megjelölésével; (b) ellenőrizd,
hogy a választott compiler státuszoldala a képességet
„implemented”-nek jelöli-e, és melyik verziótól; (c) ellenőrizd a
feature-test makrót a szabványkönyvtárban, és hogy a dokumentált
szemantika (runtime/diagnosztika) egyezik-e a working draft szövegével.
Csak a három lépés együttes eredménye után állítható bármi a gyakorlati
használhatóságról.
// serialize_cxx20_tomb.cpp — kiegészített C++20 baseline
#include <cstdio>
#include <cstddef>
struct Point { int x; int y; };
void dump(const Point& p) {
std::printf("{x=%d, y=%d}\n", p.x, p.y);
}
void dump_array(const Point* a, std::size_t n) {
std::printf("[");
for (std::size_t i = 0; i < n; ++i) {
if (i) std::printf(", ");
dump(a[i]);
}
std::printf("]\n");
}
int main() {
Point ps[3] = {{1,2}, {3,4}, {5,6}};
dump_array(ps, 3);
return 0;
}g++ -std=c++20 -O2 -Wall -Wextra serialize_cxx20_tomb.cpp -o serialize_cxx20_tombEllenőrzési feltétel: a fordítás -Wall -Wextra mellett
figyelmeztetés nélkül menjen át; a kimenet
[{x=1, y=2}, {x=3, y=4}, {x=5, y=6}] legyen. A példa a
C++20 alapszabályok szerint fordítható; a futtatás a tanuló laborjában
ellenőrizendő, nem tesztelt eredményként kezelendő.
A táblázatsor:
| Képesség | Szint | Forrás (P-/N-szám, oldal, szakasz) | Dátum | Megjegyzés |
|---|---|---|---|---|
std::execution sender/receiver |
kitöltendő (valószínűleg working draft) | kitöltendő | kitöltendő | Library implementáció külön ellenőrizendő |
A feature-test makrót (__cpp_lib_execution vagy a
sender/receiver-hez tartozó, a választott standard library
dokumentációjában megnevezett makró) a fordítóval kell kiértékeltetni. A
P-dolgozat hivatkozása azért nem elegendő, mert az a javaslat szövegét
rögzíti, nem a standard library tényleges implementációját; a makró és a
library release note együtt adja a gyakorlati támogatás bizonyítékát. A
shared_ptr-alapú összehasonlításhoz lásd shared ownership, reclamation és konkurens review
(34.6).