Udostępnij za pośrednictwem


Ostrzeżenie C26440

Funkcję można zadeklarować jako "noexcept".

Podstawowe wytyczne języka C++ F.6: jeśli funkcja może nie zostać wyrzucona, zadeklaruj ją noexcept

Jeśli kod nie powinien powodować żadnych wyjątków, powinien zostać oznaczony przy użyciu specyfikatora noexcept . Ta adnotacja pomaga uprościć obsługę błędów po stronie kodu klienta i umożliwia kompilatorowi wykonywanie większej liczby optymalizacji.

Uwagi

  • Funkcja jest uważana za niewzrzucającą, jeśli:
    • nie ma jawnych throw instrukcji;
    • wywołania funkcji w jego treści, jeśli w ogóle, wywołują tylko funkcje, które są mało prawdopodobne, aby zgłaszać: constexpr lub funkcje oznaczone z dowolną specyfikacją wyjątku, która wiąże się z nierzucaniem zachowania (w tym niektórych specyfikacji niestandardowych).
  • 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.
  • Funkcje oznaczone jako constexpr nie powinny powodować wyjątków i nie są analizowane.
  • Reguła dotyczy również wyrażeń lambda.
  • Logika nie uwzględnia wywołań cyklicznych jako potencjalnie niezrzucanych. Ta logika może ulec zmianie w przyszłości.

Przykład

Wszystkie funkcje z wyjątkiem destruktora będą ostrzegać, ponieważ brakuje żadnego wyjątku.

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

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

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