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).
- nie ma jawnych
- Niestandardowe i nieaktualne specyfikatory, takie jak
throw()
lub__declspec(nothrow)
nie są równoważnenoexcept
. - Jawne specyfikatory
noexcept(false)
inoexcept(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*/}
};
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla