Em C++, eu marco uma função como noexcept
nos seguintes casos:
A função em si não gera exceções, mas seus parâmetros de tipo de valor podem gerar exceções durante a construção.
O código a seguir demonstra essa situação:
struct A {
A(bool will_throw) {
std::cerr << "Ctor of A\n";
if (will_throw) throw std::runtime_error("An exception from A");
}
A(A&& lhs) noexcept {
std::cerr << "Move ctor of A\n";
}
~A() noexcept = default;
};
struct B {
A mem_;
// Exceptions are thrown during parameter passing, not inside the function
// Thus it isn't an UB I think.
B(A value = A(true)) noexcept : mem_{std::move(value)} {/* do nothing */}
~B() noexcept = default;
};
Neste código, o construtor de B
é marcado como noexcept
, e o A(true)
construtor padrão pode lançar uma exceção, mas acredito que isso não leva a um comportamento indefinido, pois a exceção ocorre durante a passagem de parâmetros e não dentro do corpo da função.
O programa de teste está aqui .
Minha pergunta é:
Em casos semelhantes, é seguro marcar o construtor e outras funções com noexcept
? Essa prática pode ser aplicada amplamente, especialmente em casos em que a função em si não lança nenhuma exceção?