Compartilhar via


noexcept (C++)

C++11:especifica se uma função pode lançar 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).

Comentários

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 condicional unário noexcept(constant_expression) quando constant_expression produz true, e seu sinônimo incondicional noexcept, 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 false, ou a ausência de uma especificação de exceção (exceto para um destruidor ou função de 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 forem noexcept ou const. O compilador não verifica necessariamente todos os caminhos de código em busca de exceções que possam gerar uma função noexcept. 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 de exceção dinâmica throw(). A especificação de exceção dinâmica, ou especificação throw(optional_type_list), foi preterida no C++11 e removida no 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 na 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, confira 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 tipo de dados antigo simples (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>)
{
   // ...
}

Confira também

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