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).
- non ha istruzioni esplicite
- Gli identificatori non standard e obsoleti come
throw()
o__declspec(nothrow)
non sono equivalenti anoexcept
. - Gli identificatori espliciti
noexcept(false)
enoexcept(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*/}
};