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
- try, catch, throw
- Bezpieczeństwo wyjątków
- Specyfikator noexcept
- Niestandardowe typy wyjątków