Panoramica delle novità di C++23

Panoramica delle novità di C++23

Lo standard C++23 rappresenta un'evoluzione di raffinamento rispetto al più rivoluzionario C++20. Anziché introdurre grandi paradigmi nuovi, consolida e perfeziona ciò che esisteva, aggiunge componenti attesi da tempo alla libreria e migliora l'ergonomia del linguaggio con una serie di aggiunte mirate. Il risultato è un C++ più coeso, più comodo da scrivere e con lacune importanti finalmente colmate. Passiamo in rassegna le novità più significative.

Deducing this

Una delle aggiunte più eleganti al linguaggio è la possibilità di dichiarare esplicitamente il parametro oggetto di un metodo, noto come deducing this. In pratica, il metodo può ricevere l'oggetto su cui è invocato come un parametro esplicito, dedotto come qualsiasi altro parametro template. Questo elimina la necessità di duplicare i metodi per le versioni costanti e non costanti, o per le versioni che operano su temporanei, unificando in un'unica definizione ciò che prima richiedeva più sovraccarichi quasi identici.

class Container {
    int value;

public:
    // Un solo metodo per tutte le categorie di oggetto
    template <typename Self>
    auto& get(this Self&& self) {
        return self.value;
    }
};

std::print e la formattazione diretta

Come già visto trattando la formattazione, C++23 introduce std::print e std::println, che uniscono la potenza di std::format alla stampa diretta su console. Rappresentano il modo moderno di produrre output, più conciso e sicuro rispetto agli stream tradizionali, e completano il sistema di formattazione avviato con lo standard precedente.

#include <print>

int main() {
    std::println("Ciao, {}!", "mondo");
    return 0;
}

std::expected

Tra le aggiunte più importanti alla libreria vi è std::expected, il tipo dedicato alla gestione degli errori come valore di ritorno, che abbiamo approfondito separatamente. Offre finalmente un'alternativa standard alle eccezioni per gli errori attesi e frequenti, colmando una lacuna che spingeva molti progetti a ricorrere a librerie esterne.

Il tipo generator

C++23 fornisce std::generator, il primo componente di libreria basato sulle corutine disponibile direttamente nella libreria standard. Permette di scrivere generatori pigri di sequenze con la parola chiave co_yield, senza dover implementare a mano la complessa infrastruttura di supporto richiesta in C++20. Rende così le corutine immediatamente utilizzabili per uno dei loro casi d'uso più comuni.

Miglioramenti alle ranges

La libreria delle ranges, introdotta in C++20, riceve numerosi affinamenti. Tra i più utili vi è la possibilità di materializzare il risultato di una pipeline di viste direttamente in un contenitore, un'operazione che prima richiedeva passaggi manuali. Vengono inoltre aggiunte nuove viste che ampliano il ventaglio di trasformazioni esprimibili in modo dichiarativo, rendendo la programmazione con le ranges ancora più fluida e completa.

#include <ranges>
#include <vector>

int main() {
    std::vector<int> source = {1, 2, 3, 4};

    // Materializza direttamente il risultato in un vettore
    auto doubled = source
        | std::views::transform([](int n) { return n * 2; })
        | std::ranges::to<std::vector>();
    return 0;
}

if consteval

Il costrutto if consteval consente a una funzione di comportarsi diversamente a seconda che venga valutata in fase di compilazione o di esecuzione. Completa il quadro degli strumenti per la programmazione a tempo di compilazione, permettendo di scegliere l'implementazione più adatta a ciascun contesto in modo pulito e diretto, senza ricorrere a tecniche indirette.

L'indicizzazione multidimensionale

Il linguaggio consente ora all'operatore di indicizzazione di accettare più argomenti, aprendo la strada a un accesso naturale alle strutture dati multidimensionali. Insieme al nuovo tipo std::mdspan, che offre una vista multidimensionale su una sequenza contigua di dati, questa novità migliora sensibilmente l'ergonomia del calcolo numerico e scientifico, ambiti in cui il C++ è tradizionalmente molto diffuso.

Uno standard di consolidamento

Nel complesso, C++23 è uno standard di consolidamento che rende il linguaggio più maturo e piacevole da usare. Le grandi funzionalità di C++20, come i concept, le ranges, le corutine e i moduli, ricevono qui il supporto di libreria e le rifiniture che ne rendono l'uso quotidiano più agevole. Con l'aggiunta di componenti a lungo attesi e con miglioramenti diffusi all'ergonomia, C++23 conferma la traiettoria di un linguaggio che continua a evolvere, rimanendo fedele ai propri principi di efficienza e controllo pur diventando progressivamente più espressivo e sicuro. Con questo articolo si chiude il nostro percorso attraverso il C++ moderno, dai primi passi fino alle frontiere più recenti dello standard.