Compartir vía


Advertencia C26447

La función se declara como noexcept pero llama a la función function_name que puede producir excepciones (f.6).

C++ Core Guidelines:
F.6: Si es posible que la función no se inicie, declárela como noexcept.

Comentarios

Esta regla modifica otra regla, C26440 DECLARE_NOEXCEPT, que intenta encontrar funciones que son buenas candidatas para marcar como noexcept. En este caso, la idea es que una vez que marque alguna función como noexcept, debe mantener su contrato sin invocar otro código que pueda producir excepciones.

  • El compilador de Microsoft C++ ya controla infracciones sencillas como instrucciones throw en el cuerpo de la función (consulte C4297).
  • La regla solo se centra en las llamadas de función. Marca los destinos que no son constexpr y que pueden producir excepciones. En otras palabras, no se marcan explícitamente como que no producen excepciones mediante noexcept, __declspec(nothrow) o throw().
  • Las funciones de destino generadas por el compilador se omiten para reducir el ruido, ya que el compilador no siempre proporciona especificaciones de excepción.
  • El comprobador también omite tipos especiales de funciones de destino que esperamos implementar como noexcept; C26439 SPECIAL_NOEXCEPT aplica esta regla.

Ejemplo

#include <vector>
#include <string>
#include <istream>

std::vector<std::string> collect(std::istream& is) noexcept
{
    std::vector<std::string> res;
    for (std::string s; is >> s;) // C26447, `operator bool()` can  throw, std::string's allocator can throw
        res.push_back(s);         // C26447, `push_back` can throw
    return res;
}

Puede corregir estas advertencias quitando noexcept de la signatura de función.

Consulte también

C26440 DECLARE_NOEXCEPT