C++23
Főnév
C++23 (tsz. C++23s)
- (informatika) A C++23 a C++ szabvány legújabb, 2023-ban véglegesített verziója. A célja, hogy tovább finomítsa a C++20 újításait, egyszerűsítse a fejlesztést, és még jobb típusbiztonságot, konzisztenciát, valamint felhasználóbarát szintaxist biztosítson.
Bár nem olyan radikálisan nagy frissítés, mint a C++11 vagy C++20 volt, C++23 nagyon sok „quality of life” fejlesztést hoz.
🔹 Főbb újítások áttekintés
| Terület | Újdonság |
|---|---|
| Nyelvi elemek | deducing this, explicit(obj), multidimensional subscript |
| STL fejlesztések | std::expected, std::flat_map, std::generator, ranges bővítések |
| Konstans logika | constexpr STL algoritmusok, hibakezelés |
| Modulok és tooling | Fejlettebb module támogatás |
| Általános minőségjavítás | Ergonómia, fordítási hibák tisztázása, jobb template diagnosztika |
🔹 1. deducing this – tagfüggvény sablonos this-sel
C++23-tól kezdve megadható a this paraméter explicit módon a tagfüggvényben:
struct Vec2 {
float x, y;
auto magnitude(this const Vec2& self) {
return std::sqrt(self.x * self.x + self.y * self.y);
}
};
Hasznos például CRTP-nél, vagy ha this-t külön szeretnénk sablonozni (pl. forwarding referencia, && stb.).
🔹 2. explicit(obj) konstruktor
A explicit kulcsszó most már runtime feltételhez is köthető:
struct MyType {
explicit(false) MyType(int); // nem explicit
explicit(true) MyType(double); // explicit
};
Ez lehetővé teszi, hogy egy konstruktor explicit vagy implicit legyen feltétel alapján, például constexpr if-et használva.
🔹 3. Többdimenziós [] operátor
C++23-tól támogatott a operator[] több dimenzióval:
struct Matrix {
int operator[](size_t i, size_t j) const {
return i * 10 + j;
}
};
Matrix m;
std::cout << m[2, 3]; // 23
Eddig ilyet csak operator()-sal lehetett.
🔹 4. std::expected<T, E> – hiba-visszatérítési alternatíva
Ez az új típus a std::optional és std::variant mintájára ad lehetőséget hibakezelésre:
#include <expected>
std::expected<int, std::string> divide(int a, int b) {
if (b == 0)
return std::unexpected("Divide by zero");
return a / b;
}
Ez egy monadikus alternatíva az exception-használatra.
🔹 5. std::flat_map, flat_set
Ezek sorozatban tárolt asszociatív konténerek (std::vector-alapú), melyek gyakran gyorsabbak kis adathalmazokra, mint a std::map.
std::flat_map<std::string, int> scores{
{"Anna", 5},
{"Béla", 7}
};
🔹 6. std::generator – egyszerű coroutine típus
C++20 coroutines mellé végre jön a standard generator típus:
#include <generator>
std::generator<int> count_to(int n) {
for (int i = 1; i <= n; ++i)
co_yield i;
}
for (int x : count_to(5))
std::cout << x << " ";
Nem kell saját coroutine promise_type-et írni.
🔹 7. std::print és std::println
Egyszerű szövegkiírás std::format alapokon:
#include <print>
int main() {
std::print("Hello, {}!\n", "world");
}
Ez sokkal praktikusabb, mint a std::cout.
🔹 8. constexpr STL algoritmusok
Mostantól a legtöbb STL algoritmus constexpr módon is futtatható:
constexpr auto sorted = [] {
std::array a = {3, 1, 4};
std::ranges::sort(a);
return a;
}();
🔹 9. Modulok finomítása
A C++20-as modules tovább fejlődött:
- Jobb tooling támogatás
import std;→ a teljes standard könyvtár modulként
🔹 10. Egyéb kisebb újítások
| Funkció | Leírás | |
|---|---|---|
assume(expr) attribútum |
Segíti az optimalizálást, ha biztos vagy egy feltételben | |
std::move_only_function |
std::function, de csak move-olható (hatékonyabb) |
|
monadic ops && ` |
or_else()` |
std::optional, std::expected láncolható feldolgozás |
starts_with, ends_with a std::string-ben |
Egyszerűbb szövegműveletek | |
std::ranges::to<>() |
Konverzió vector-ba, set-be stb. ranges alapján |
🔹 Összefoglaló táblázat
| Téma | Újdonság |
|---|---|
| Nyelv | deducing this, explicit(obj), multidim [] |
| STL | expected, flat_map, generator, print |
| Hibakezelés | std::expected, monadikus feldolgozás |
| Funkcionális kód | ranges → container konverzió (to<>) |
| Coroutine támogatás | egyszerű std::generator |
| Fordítási idő optimalizáció | több constexpr STL algoritmus |
| Modulok | import std; támogatása |
🔚 Zárszó
A C++23 célja, hogy még olvashatóbb, karbantarthatóbb és biztonságosabb nyelvet adjon a fejlesztők kezébe. Nem radikális, de sok apró kényelmi fejlesztést hoz, különösen a hibakezelés, ranges, és coroutine terén.