0Pricing
C++ Academy · Lekcja

Specyfikator noexcept

Oznaczaj funkcje, które nie zgłaszają wyjątków

Specyfikator noexcept to bezpłatna lekcja C++ Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C++ Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co deklaruje noexcept

Specyfikator noexcept zapewnia, że funkcja nie zgłosi wyjątku. Jeśli mimo to go zgłosi, program wywoła std::terminate.

#include <iostream>

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

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

Dlaczego ma to znaczenie

Wiedza o tym, że funkcja nie może zgłosić wyjątku, pozwala kompilatorowi i bibliotece optymalizować kod — na przykład wybierać przenoszenie zamiast kopiowania podczas zwiększania rozmiaru kontenera.

Operacje przenoszenia powinny być noexcept

std::vector używa Państwa konstruktora przenoszącego podczas realokacji tylko wtedy, gdy jest on oznaczony jako noexcept; w przeciwnym razie dla bezpieczeństwa kopiuje elementy. Dlatego operacje przenoszenia należy oznaczać jako noexcept.

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

Destruktory domyślnie mają noexcept

Od C++11 destruktory są niejawnie oznaczone jako noexcept. Wydostanie się wyjątku z destruktora powoduje zakończenie programu.

Warunkowe noexcept

noexcept(expr) uzależnia gwarancję od wartości logicznej znanej w czasie kompilacji — jest to przydatne w szablonach przekazujących gwarancję innego typu.

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

Sprawdzanie za pomocą operatora noexcept

noexcept(expr) użyte jako operator zwraca wartość true, jeśli wyrażenie jest zadeklarowane jako niezgłaszające wyjątków — jest to przydatne w szablonach.

#include <iostream>

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

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

noexcept jest częścią typu

Od C++17 noexcept jest częścią typu wskaźnika do funkcji, więc funkcji zgłaszającej wyjątki nie można przypisać do wskaźnika noexcept.

Nie składaj obietnic bez pokrycia

Funkcję należy oznaczać jako noexcept tylko wtedy, gdy mają Państwo pewność, że nie może zgłosić wyjątku. Fałszywa obietnica, która zostanie naruszona, powoduje awarię całego programu.

Dobre zastosowania

Funkcje zamiany, operacje przenoszenia, destruktory, proste funkcje dostępowe i pomocnicze funkcje arytmetyczne są naturalnymi kandydatami do oznaczenia jako noexcept.

noexcept a throw()

Stara dynamiczna specyfikacja throw() jest przestarzała i została usunięta. We współczesnym C++ należy zamiast niej używać noexcept.

Wydajność i bezpieczeństwo

noexcept zarówno dokumentuje zamiar, jak i umożliwia optymalizacje, takie jak przenoszenie podczas realokacji — to niewielka adnotacja o rzeczywistym znaczeniu.

Szybkie sprawdzenie

Proszę sprawdzić swoją znajomość noexcept.

Podsumowanie

Poznali Państwo specyfikator noexcept, który zapewnia, że nie wystąpią wyjątki, i umożliwia optymalizacje, takie jak przenoszenie podczas realokacji. Operacje przenoszenia, funkcje zamiany i destruktory należy oznaczać jako noexcept, w szablonach używać form warunkowych i nigdy nie składać obietnic bez pokrycia.

Często zadawane pytania

Czy lekcja „Specyfikator noexcept” jest bezpłatna?

Tak — pełny tekst „Specyfikator noexcept” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C++ Academy, przejdź na CoddyKit PRO. Kurs C++ Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Specyfikator noexcept”?

Oznaczaj funkcje, które nie zgłaszają wyjątków Ćwiczysz C++ Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C++ Academy?

Nie wymagamy żadnego doświadczenia. C++ Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Specyfikator noexcept”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C++ Academy?

Tak. Każda lekcja C++ Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. try, catch, throw
  2. Bezpieczeństwo wyjątków
  3. Specyfikator noexcept
  4. Niestandardowe typy wyjątków
← Powrót do C++ Academy