Partilhar via


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

A 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. Operador noexcept(constant_expression) condicional unário quando constant_expression produz true, e seu sinônimo noexceptincondicional , especificam que o conjunto de tipos de exceção potenciais que podem sair de uma função está vazio. Ou seja, a função nunca lança 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 false, ou a ausência de uma especificação de exceção (exceto para uma função de destruidor ou desalocar), 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 todos os caminhos de código em busca de exceções que possam borbulhar até 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 os destruidores de quaisquer objetos no escopo serão invocados. Use noexcept em vez do especificador throw()de exceção dinâmico . 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 para throw(), que é um alias para noexcept(true). Recomendamos que você aplique noexcept a qualquer função que nunca permita que uma exceção se propague para cima da pilha de chamadas. Quando uma função é declarada noexcept, ela permite que o compilador gere código mais eficiente em vários contextos diferentes. Para obter mais informações, consulte Especificações de exceção.

Exemplo

Um modelo de função que copia seu argumento pode ser declarado noexcept na condição de que o objeto que está sendo copiado seja um tipo de dados antigo (POD). Tal função poderia ser declarada assim:

#include <type_traits>

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

Ver também

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