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


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

Такой вид функции может не вызывать. Объявите его "noexcept".

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

Некоторые операции никогда не должны вызывать исключения. Их реализации должны быть надежными и должны обрабатывать возможные ошибки корректно. Они не должны использовать исключения для обозначения сбоя. В таких случаях флаги правил, когда такие операции не помечены noexceptявным образом, что означает, что они могут создавать исключения и потребители не могут делать предположения о его надежности.

Важно, чтобы эти функции были надежными, так как они часто используются в качестве стандартных блоков для реализации функций с гарантиями безопасности исключений. Конструктор перемещения, который создает контейнеры стандартной библиотеки шаблонов (STL), будут возвращать операции копирования, уменьшая производительность среды выполнения.

Имя анализа кода: SPECIAL_NOEXCEPT

Замечания

  • Специальные виды операций:

    • Деструкторы;
    • перемещение конструкторов и операторов назначения перемещения;
    • стандартные функции с семантикой перемещения: std::move и std::swap.
  • Нестандартные и устаревшие описатели, такие как throw() или declspec(nothrow) не эквивалентны noexcept.

  • Явные описатели noexcept(false) и noexcept(true) уважаются соответствующим образом.

Пример

Средство предупреждает обо всех функциях, кроме деструктора, так как они отсутствуют noexcept.

struct S
{
    ~S() {}

    S(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
    S& operator=(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)

    S(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
    S& operator=(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
};

При noexcept декорировании одной структуры все предупреждения удаляются.

struct S
{
    ~S() {}

    S(S&& s) noexcept {/*impl*/}
    S& operator=(S&& s) noexcept {/*impl*/}

    S(const S& s) noexcept {/*impl*/}
    S& operator=(const S& s) noexcept {/*impl*/}
};

См. также

C26455
F.6. Если функция не должна вызываться, объявите ее noexcept