Structured Bindings e Attributi
Il C++ (in particolare dal C++17 in poi) ha introdotto un meccanismo estetico formidabile per estrarre valori multipli dalle funzioni, oltre a un sistema ufficiale per etichettare il codice destinato al compilatore.
Structured Bindings
Section titled “Structured Bindings”Spesso capiterà di scrivere funzioni che possono “fallire” e che, in concomitanza, devono ritornare un valore utile. Storicamente si lanciavano le Eccezioni oppure si ritornava un codice di errore e si scriveva il valore vero in un puntatore passato per riferimento (macchinoso!).
Il Structured Binding permette di “spacchettare” (unpack) un oggetto POD (Plain Old Data class), come un raggruppamento di struct, direttamente nelle sue variabili costituenti, in un solo colpo, da sinistra a destra (dall’alto in basso nella struct).
La sintassi è: auto [obj1, obj2, obj3] = oggetto_da_spacchettare;
(N.B: I tipi e i nomi delle variabili destinate all’unpack non devono avere necessariamente lo stesso nome o tipo exact-match di quelle dichiarate nella struct).
Gli Attributi Standard
Section titled “Gli Attributi Standard”Gli Attributi (Attributes) applicano delle speciali caratteristiche e direttive d’ottimizzazione a un blocco d’istruzioni, a un tipo o a una funzione. Servono a comunicare intenzioni profonde al compilatore.
La sintassi è racchiusa da doppie parentesi quadre: [[nome_attributo]].
Tabella degli Attributi Standard più comuni:
| Attributo | Significato |
|---|---|
[[noreturn]] | Indica brutalmente al compilatore che questa funzione “non tornerà mai indietro” (ad es. lancia sempre un’eccezione o contiene un loop infinito voluto). Aiuta l’ottimizzatore a fare pulizia di rami morti e silenzia i warning di “mancanza del return”. |
[[nodiscard]] | Indica che il programmatore DEVE OBBLIGATORIAMENTE usare il valore restituito da questa funzione (ad es. per i codici di errore critici). Se l’utente chiama la funzione e ne ignora il risultato (scartandolo), la compilazione vomiterà un potente Warning (o Errore a seconda delle impostazioni). |
[[deprecated("motivo")]] | Contrassegna una funzione o classe come deprecata (non più supportata / vecchia). Qualsiasi sviluppatore che proverà a usarla riceverà un Warning al compile time con il testo del motivo. Ottima se scrivi librerie di largo consumo. |
[[maybe_unused]] | Silenzia le noie del compilatore quando definisci volontariamente una variabile che potresti momentaneamente non usare (ad es. in fase di debug o sotto direttive ifdef). |
[[fallthrough]] | (Raro) Nello switch, segnala al compilatore che stiamo intenzionalmente ‘cadendo’ nel case successivo senza usare il break, spegnendo i warning. |