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 mediantenoexcept
,__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.