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


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

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

Основные рекомендации C++ 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
Основные рекомендации C++ F.6