noexcept (C++)

C++11: Especifica se uma função pode gerar exceções.

Sintaxe

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

Parâmetros

constant-expression
Uma expressão constante de tipo bool que representa se o conjunto de tipos de exceção potenciais está vazio. A versão incondicional é equivalente a noexcept(true).

Observações

Um noexcept-expression é um tipo de especificação de exceção: um sufixo para uma declaração de função que representa um conjunto de tipos que podem ser correspondidos por um manipulador de exceção para qualquer exceção que saia de uma função. O operador noexcept(constant_expression) condicional unário quando constant_expression produz true, e seu sinônimo noexceptincondicional, especifica que o conjunto de tipos de exceção potenciais que podem sair de uma função está vazio. Ou seja, a função nunca gera uma exceção e nunca permite que uma exceção seja propagada fora de seu escopo. O operador noexcept(constant_expression) quando constant_expression produz falseou a ausência de uma especificação de exceção (diferente de uma função de destruidor ou desalocação), indica que o conjunto de exceções potenciais que podem sair da função é o conjunto de todos os tipos.

Marque uma função como noexcept somente se todas as funções que ela chama, direta ou indiretamente, também noexcept forem ou const. O compilador não verifica necessariamente cada caminho de código em busca de exceções que possam chegar a uma noexcept função. Se uma exceção sair do escopo externo de uma função marcada noexcept, std::terminate será invocada imediatamente e não haverá garantia de que destruidores de quaisquer objetos no escopo serão invocados. Use noexcept em vez do especificador throw()de exceção dinâmica. A especificação de exceção dinâmica, ou throw(optional_type_list) especificação, foi preterida em C++11 e removida em C++17, exceto por throw(), que é um alias para noexcept(true). Recomendamos que você aplique noexcept a qualquer função que nunca permita que uma exceção propague a pilha de chamadas. Quando uma função é declarada noexcept, ela permite que o compilador gere um código mais eficiente em vários contextos diferentes. Para obter mais informações, consulte As especificações de exceção.

Exemplo

Um modelo de função que copia seu argumento pode ser declarado noexcept com a condição de que o objeto que está sendo copiado seja um POD (tipo de dados simples e antigo). Essa função pode ser declarada desta forma:

#include <type_traits>

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

Consulte também

Práticas recomendadas do C++ modernas para tratamento de erros e exceções
Especificações de exceção (throw, noexcept)