C++ Academy · Lektion

noexcept-specifikatoren

Markér funktioner, der ikke kaster exceptions

Lektion 3 af 413 trin

noexcept-specifikatoren er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad noexcept erklærer

Specifikatoren noexcept lover, at en funktion ikke rejser en undtagelse. Hvis den alligevel gør det, kalder programmet std::terminate.

#include <iostream>

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

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

Hvorfor det er vigtigt

Når compiler og bibliotek ved, at en funktion ikke kan rejse en undtagelse, kan de optimere — for eksempel ved at vælge flytning frem for kopiering, når en beholder vokser.

Flytteoperationer bør være noexcept

std::vector bruger kun din flyttekonstruktør ved omallokering, hvis den er noexcept; ellers kopierer den af hensyn til sikkerheden. Markér derfor flytteoperationer med noexcept.

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

Destruktører er som standard noexcept

Siden C++11 er destruktører implicit noexcept. Hvis du lader en undtagelse slippe ud af en destruktør, afsluttes programmet.

Betinget noexcept

noexcept(expr) lader løftet afhænge af en boolesk værdi ved kompilering — nyttigt i skabeloner, der videresender en anden types garanti.

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);
}

Forespørgsel med noexcept-operatoren

noexcept(expr) som operator giver true, hvis udtrykket er erklæret til ikke at rejse en undtagelse — praktisk i skabeloner.

#include <iostream>

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

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

noexcept er en del af typen

Siden C++17 er noexcept en del af typen for en funktionspeger, så en funktion, der kan rejse undtagelser, kan ikke bindes til en noexcept-peger.

Lov ikke for meget

Markér kun en funktion med noexcept, hvis du er sikker på, at den ikke kan rejse en undtagelse. Et falsk løfte, der bliver brudt, får hele programmet til at gå ned.

Gode kandidater

Ombytninger, flytteoperationer, destruktører, simple getter-metoder og aritmetiske hjælpefunktioner er naturlige noexcept-funktioner.

noexcept kontra throw()

Den gamle dynamiske specifikation throw() er forældet og fjernet. Brug i stedet noexcept i moderne C++.

Ydeevne og sikkerhed

noexcept dokumenterer både hensigten og muliggør optimeringer som flytning ved omallokering — en lille annotering med reel virkning.

Hurtig test

Test din forståelse af noexcept.

Opsummering

Du har lært, at specifikatoren noexcept lover, at der ikke rejses undtagelser, og muliggør optimeringer som flytning ved omallokering. Markér flytteoperationer, ombytninger og destruktører med noexcept, brug betingede former i skabeloner, og lov aldrig for meget.

Gratis at komme i gang

Lær C++ med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “noexcept-specifikatoren” gratis?

Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “noexcept-specifikatoren”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “noexcept-specifikatoren”?

Markér funktioner, der ikke kaster exceptions Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C++ Academy?

Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “noexcept-specifikatoren”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C++ Academy-lektion?

Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. try, catch, throw
  2. Exception-sikkerhed
  3. noexcept-specifikatoren
  4. Brugerdefinerede exception-typer
← Tilbage til C++ Academy