noexcept
(C++)
C++11: Určuje, jestli může funkce vyvolat výjimky.
Syntaxe
noexcept-specifier
:
noexcept
noexcept-expression
throw
(
)
noexcept-expression
:
noexcept
(
constant-expression
)
Parametry
constant-expression
Konstantní výraz typu bool
, který představuje, zda sada potenciálních typů výjimek je prázdná. Nepodmíněná verze je ekvivalentní noexcept(true)
.
Poznámky
A noexcept-expression
je druh specifikace výjimky: přípona deklarace funkce, která představuje sadu typů, které mohou být spárovány obslužnou rutinou výjimky pro všechny výjimky, které ukončí funkci. Unární podmíněný operátor noexcept(constant_expression)
při výnosu true
a jeho nepodmíněné synonymum noexcept
určuje, že sada potenciálních typů výjimek, které mohou ukončit funkciconstant_expression
, je prázdná. To znamená, že funkce nikdy nevyvolá výjimku a nikdy neumožňuje rozšířit výjimku mimo její obor. noexcept(constant_expression)
Operátor při constant_expression
výnosu false
nebo nepřítomnost specifikace výjimky (jiné než pro destruktor nebo funkci uvolnění), označuje, že sada potenciálních výjimek, které mohou funkci ukončit, je sada všech typů.
Funkci označte jako noexcept
pouze v případě, že všechny funkce, které volá, buď přímo nebo nepřímo, jsou také noexcept
nebo const
. Kompilátor nemusí nutně kontrolovat všechny cesty kódu pro výjimky, které by mohly bubliny až na noexcept
funkci. Pokud výjimka ukončí vnější rozsah označené noexcept
funkce , std::terminate
je vyvolána okamžitě a neexistuje žádná záruka, že destruktory všech objektů v oboru budou vyvolány. Použijte noexcept
místo specifikátoru throw()
dynamické výjimky . Specifikace dynamické výjimky nebo throw(optional_type_list)
specifikace byla v jazyce C++11 zastaralá a odebrána v jazyce C++17 s výjimkou throw()
, což je alias pro noexcept(true)
. Doporučujeme použít noexcept
všechny funkce, které nikdy nepovolují rozšíření zásobníku volání výjimku. Když je funkce deklarována noexcept
, umožňuje kompilátoru generovat efektivnější kód v několika různých kontextech. Další informace naleznete v tématu Specifikace výjimek.
Příklad
Šablona funkce, která kopíruje svůj argument, může být deklarována noexcept
za podmínky, že zkopírovaný objekt je prostý starý datový typ (POD). Taková funkce by mohla být deklarována takto:
#include <type_traits>
template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
{
// ...
}
Viz také
Moderní osvědčené postupy jazyka C++ pro výjimky a zpracování chyb
Specifikace výjimek (throw
, noexcept
)