noexcept (C++)

C++11: określa, czy funkcja może zgłaszać wyjątki.

Składnia

noexcept-specifier:
noexcept
noexcept-expression
throw ( )
noexcept-expression:
noexcept ( constant-expression )

Parametry

constant-expression
Stałe wyrażenie typu bool , które reprezentuje, czy zestaw potencjalnych typów wyjątków jest pusty. Wersja bezwarunkowa jest równoważna .noexcept(true)

Uwagi

Jest noexcept-expression to rodzaj specyfikacji wyjątku : sufiks deklaracji funkcji, który reprezentuje zestaw typów, które mogą być dopasowane przez program obsługi wyjątków dla każdego wyjątku, który zamyka funkcję. Jednoargumentowy operator noexcept(constant_expression) warunkowytrue, gdy constant_expression zwraca wartość , i jego bezwarunkowy synonim noexcept, określ, że zestaw potencjalnych typów wyjątków, które mogą zakończyć działanie funkcji, jest pusty. Oznacza to, że funkcja nigdy nie zgłasza wyjątku i nigdy nie zezwala na propagację wyjątku poza jej zakresem. Operator noexcept(constant_expression) , gdy constant_expression zwraca wartość falselub brak specyfikacji wyjątku (innej niż dla funkcji destruktora lub cofania), wskazuje, że zestaw potencjalnych wyjątków, które mogą zakończyć działanie funkcji, jest zestawem wszystkich typów.

Oznacz funkcję jako noexcept tylko wtedy, gdy wszystkie funkcje, które wywołuje, bezpośrednio lub pośrednio, są również lub noexceptconst. Kompilator nie musi sprawdzać każdej ścieżki kodu pod kątem wyjątków, które mogą być bąbelkowe noexcept do funkcji. Jeśli wyjątek nie zamyka zewnętrznego zakresu funkcji oznaczonej noexceptstd::terminate , jest wywoływany natychmiast i nie ma żadnej gwarancji, że destruktory żadnych obiektów w zakresie zostaną wywołane. Użyj noexcept zamiast specyfikatora throw()wyjątku dynamicznego . Specyfikacja wyjątku dynamicznego lub throw(optional_type_list) specyfikacja została uznana za przestarzałą w języku C++11 i usunięta w języku C++17, z wyjątkiem elementu throw(), który jest aliasem dla noexcept(true)języka . Zalecamy zastosowanie noexcept do dowolnej funkcji, która nigdy nie zezwala na propagację stosu wywołań. Gdy funkcja jest zadeklarowana noexcept, umożliwia kompilatorowi generowanie bardziej wydajnego kodu w kilku różnych kontekstach. Aby uzyskać więcej informacji, zobacz Specyfikacje wyjątków.

Przykład

Szablon funkcji, który kopiuje jego argument, może zostać zadeklarowany noexcept pod warunkiem, że skopiowany obiekt jest zwykłym starym typem danych (POD). Taką funkcję można zadeklarować w następujący sposób:

#include <type_traits>

template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
{
   // ...
}

Zobacz też

Nowoczesne najlepsze rozwiązania dotyczące języka C++ dotyczące wyjątków i obsługi błędów
Specyfikacje wyjątków (throw, noexcept)