0Pricing
C++ Academy · Lezione

Specificatore noexcept

Contrassegnare le funzioni che non lanciano eccezioni

Specificatore noexcept è una lezione C++ Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C++ Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C++ Academy include 4 lezioni in totale.

Che cosa dichiara noexcept

Lo specificatore noexcept garantisce che una funzione non solleverà eccezioni. Se invece ne solleva una, il programma chiama std::terminate.

#include <iostream>

int square(int x) noexcept {
    return x * x;
}

int main() {
    std::cout << square(5) << "\n";
}

Perché è importante

Sapere che una funzione non può sollevare eccezioni permette al compilatore e alla libreria di ottimizzare, ad esempio scegliendo gli spostamenti invece delle copie durante la crescita di un contenitore.

Le operazioni di spostamento devono essere noexcept

std::vector utilizza il costruttore di spostamento durante il riallocamento solo se è noexcept; altrimenti, per sicurezza, esegue una copia. Contrassegni quindi gli spostamenti come noexcept.

struct Buffer {
    int* p;
    Buffer(Buffer&& o) noexcept : p(o.p) { o.p = nullptr; }
};

I distruttori sono noexcept per impostazione predefinita

A partire da C++11, i distruttori sono implicitamente noexcept. Lasciare che un'eccezione fuoriesca da un distruttore termina il programma.

noexcept condizionale

noexcept(expr) rende la garanzia dipendente da un valore booleano determinato in fase di compilazione, utile nei template che inoltrano la garanzia di un altro tipo.

template <class T>
void swapValues(T& a, T& b) noexcept(noexcept(T(std::move(a)))) {
    T tmp = std::move(a);
    a = std::move(b);
    b = std::move(tmp);
}

Verificare con l'operatore noexcept

Utilizzato come operatore, noexcept(expr) restituisce true se l'espressione è dichiarata come priva di eccezioni, una funzione utile nei template.

#include <iostream>

int f() noexcept { return 1; }
int g() { return 2; }

int main() {
    std::cout << noexcept(f()) << " " << noexcept(g()) << "\n";  // 1 0
}

noexcept fa parte del tipo

A partire da C++17, noexcept fa parte del tipo di un puntatore a funzione, quindi una funzione che può sollevare eccezioni non può essere associata a un puntatore noexcept.

Non prometta più del dovuto

Contrassegni una funzione come noexcept solo se è certo che non possa sollevare eccezioni. Una falsa garanzia, se violata, causa l'arresto dell'intero programma.

Candidati ideali

Le operazioni di scambio, quelle di spostamento, i distruttori, i semplici getter e le funzioni ausiliarie aritmetiche sono candidati naturali per essere funzioni noexcept.

noexcept rispetto a throw()

La vecchia specifica dinamica throw() è deprecata e rimossa. Nel C++ moderno utilizzi invece noexcept.

Prestazioni e sicurezza

noexcept documenta l'intento e abilita inoltre ottimizzazioni come move-on-realloc: una piccola annotazione con un impatto concreto.

Verifica rapida

Verifichi la comprensione di noexcept.

Riepilogo

Ha imparato che lo specificatore noexcept garantisce l'assenza di eccezioni e abilita ottimizzazioni come lo spostamento durante il riallocamento. Contrassegni spostamenti, operazioni di scambio e distruttori come noexcept, utilizzi le forme condizionali nei template e non prometta mai più del dovuto.

Domande Frequenti

La lezione «Specificatore noexcept» è gratuita?

Sì — il testo completo di «Specificatore noexcept» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C++ Academy, passa a CoddyKit PRO. Il corso C++ Academy include 4 lezioni in totale.

Cosa imparerò in «Specificatore noexcept»?

Contrassegnare le funzioni che non lanciano eccezioni Eserciti C++ Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C++ Academy?

Non è richiesta alcuna esperienza precedente. C++ Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Specificatore noexcept»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C++ Academy?

Sì. Ogni lezione C++ Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. try, catch, throw
  2. Sicurezza rispetto alle eccezioni
  3. Specificatore noexcept
  4. Tipi di eccezione personalizzati
← Torna a C++ Academy