Condividi tramite


Avviso C26440

La funzione può essere dichiarata 'noexcept'.

Linee guida di base di C++ F.6: se la funzione potrebbe non generare, dichiararla noexcept

Se il codice non dovrebbe causare eccezioni, deve essere contrassegnato usando l'identificatore noexcept . Questa annotazione consente di semplificare la gestione degli errori sul lato codice client e consente al compilatore di eseguire altre ottimizzazioni.

Osservazioni:

  • Una funzione viene considerata non generata se:
    • non ha istruzioni esplicite throw ;
    • le chiamate di funzione nel corpo, se presenti, richiamano solo le funzioni che probabilmente generano: constexpr o funzioni contrassegnate con qualsiasi specifica di eccezione che comporta un comportamento non generabile (incluse alcune specifiche non standard).
  • Gli identificatori non standard e obsoleti come throw() o __declspec(nothrow) non sono equivalenti a noexcept.
  • Gli identificatori espliciti noexcept(false) e noexcept(true) vengono rispettati in modo appropriato.
  • Le funzioni contrassegnate come constexpr non dovrebbero causare eccezioni e non vengono analizzate.
  • La regola si applica anche alle espressioni lambda.
  • La logica non considera le chiamate ricorsive come potenzialmente non generate. Questa logica può cambiare in futuro.

Esempio

Tutte le funzioni ad eccezione del distruttore avvisano perché non sono presenti eccezioni.

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

Con noexcept che decora la stessa struttura, tutti gli avvisi vengono rimossi.

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