Поделиться через


Предупреждение C26447

Функция объявлена noexcept , но вызывает функцию function_name , которая может вызывать исключения (f.6).

Основные рекомендации по C++
F.6. Если функция не может вызываться, объявите ее noexcept.

Замечания

Это правило изменяет другое правило, C26440 DECLARE_NOEXCEPT, которое пытается найти функции, которые являются хорошими кандидатами для обозначения как noexcept. В этом случае идея заключается в том, что как только вы помечаете какую-то функцию как noexcept, она должна сохранить свой контракт, не вызывая другой код, который может вызывать исключения.

  • Компилятор Microsoft C++ уже обрабатывает простые нарушения, такие как throw инструкции в теле функции (см. раздел C4297).
  • Правило фокусируется только на вызовах функций. Он помечает целевые объекты, которые не constexpr являются и которые могут потенциально вызывать исключения. Другими словами, они не помечены явным образом как неисключаемые с помощью noexcept, __declspec(nothrow)или throw().
  • Созданные компилятором целевые функции пропускаются для снижения шума, так как спецификации исключений не всегда предоставляются компилятором.
  • Средство проверки также пропускает специальные типы целевых функций, которые мы ожидаем, что вы реализуете как noexcept; это правило применяется SPECIAL_NOEXCEPT C26439.

Пример

#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;
}

Эти предупреждения можно исправить, удалив noexcept из сигнатуры функции.

См. также

C26440 DECLARE_NOEXCEPT