Ugrás a tartalomhoz

C++23

A Wikiszótárból, a nyitott szótárból


Főnév

C++23 (tsz. C++23s)

  1. (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.