Udostępnij przez


Ostrzeżenie C26439

Tego rodzaju funkcja może nie zostać wyrzucona. Zadeklaruj go "noexcept".

F.6: Jeśli funkcja nie może zostać wyrzucona, zadeklaruj ją noexcept

Niektóre operacje nigdy nie powinny zgłaszać wyjątków. Ich implementacje powinny być niezawodne i powinny bezpiecznie obsługiwać możliwe warunki błędów. Nie powinny używać wyjątków, aby wskazać błąd. Ta reguła flaguje przypadki, w których takie operacje nie są jawnie oznaczone jako noexcept, co oznacza, że mogą zgłaszać wyjątki, a konsumenci nie mogą zakładać jego niezawodności.

Ważne jest, aby te funkcje były niezawodne, ponieważ są one często używane jako bloki konstrukcyjne do implementowania funkcji z gwarancjami bezpieczeństwa wyjątków. Konstruktor przenoszenia, który zgłasza, zmusi kontenery standardowej biblioteki szablonów (STL) do powrotu do operacji kopiowania, co zmniejsza wydajność środowiska uruchomieniowego.

Nazwa analizy kodu: SPECIAL_NOEXCEPT

Uwagi

  • Specjalne rodzaje operacji:

    • Destruktory;
    • konstruktory przenoszenia i operatory przypisania przenoszenia;
    • standardowe funkcje z semantykami przenoszenia: std::move i std::swap.
  • Niestandardowe i nieaktualne specyfikatory, takie jak throw() lub declspec(nothrow) nie są równoważne .noexcept

  • Jawne specyfikatory noexcept(false) i noexcept(true) są odpowiednio przestrzegane.

Przykład

Narzędzie ostrzega wszystkie funkcje z wyjątkiem destruktora, ponieważ brakuje noexceptgo .

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

W przypadku noexcept dekorowania tej samej struktury wszystkie ostrzeżenia są usuwane.

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*/}
};

Zobacz też

C26455
F.6: Jeśli funkcja nie może zostać wyrzucona, zadeklaruj ją noexcept