Skip to content

Latest commit

 

History

History
63 lines (46 loc) · 2.31 KB

File metadata and controls

63 lines (46 loc) · 2.31 KB
title Warning C26439
ms.date 11/15/2017
f1_keywords
C26439
SPECIAL_NOEXCEPT
helpviewer_keywords
C26439
ms.assetid 9df2a1b0-ea94-4884-9d28-c1522ec33a1b
description CppCoreCheck rule C26439 that enforces C++ Core Guidelines F.6

Warning C26439

This kind of function may not throw. Declare it 'noexcept'.

C++ Core Guidelines F.6: If your function may not throw, declare it noexcept

Some kinds of operations should never cause exceptions. Their implementations should be reliable and should handle possible errors conditions gracefully. They should never use exceptions to indicate failure. This rule flags cases where such operations aren't explicitly marked as noexcept, which means that they may throw exceptions and can't convey assumptions about their reliability.

Remarks

  • Special kinds of operations:

    • destructors;
    • default constructors;
    • move constructors and move assignment operators;
    • standard functions with move semantics: std::move and std::swap.
  • Non-standard and outdated specifiers like throw() or declspec(nothrow) aren't equivalent to noexcept.

  • Explicit specifiers noexcept(false) and noexcept(true) are respected appropriately.

  • The warning may still appear for operations that are marked as constexpr. This check may change in future releases.

Example

All functions except the destructor will warn because they're missing noexcept.

struct S
{
    S() {} // C26455, Default constructor may not throw. Declare it 'noexcept'
    ~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'
};

With noexcept decorating the same structure, all warnings are removed.

struct S
{
    S() noexcept {}
    ~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*/}
};