Ostrzeżenie kompilatora (poziom 1) C4834
odrzucanie zwracanej wartości funkcji z atrybutem "nodiscard"
Uwagi
Począwszy od języka C++17 Standard, atrybut określa, [[nodiscard]]
że wartość zwracana funkcji nie jest przeznaczona do odrzucenia. Jeśli obiekt wywołujący odrzuci wartość zwracaną, kompilator generuje ostrzeżenie C4834. Mimo że ten atrybut został wprowadzony w języku C++17, kompilator szanuje ten atrybut i generuje ostrzeżenia związane z nim podczas używania /std:c++14
i nowszych.
Aby rozwiązać to ostrzeżenie, rozważ, dlaczego kod nie używa wartości zwracanej. Użycie funkcji może być niezgodne z jej intencją. Możesz obejść to ostrzeżenie, przypisując wartość do std::ignore
elementu lub przez rzutowanie jej na void
wartość , jeśli odrzucenie wartości jest zamierzone.
Przypisanie do std::ignore
jest preferowane w przypadku rzutowania do void
w języku C++11 i nowszym, ponieważ sprawia, że intencja jest jaśniejsza i nie wyzwoli ostrzeżenia C26457 , jeśli jest włączona w ustawieniach analizy kodu.
To ostrzeżenie zostało wprowadzone w programie Visual Studio 2017 w wersji 15.3 jako ostrzeżenie poziomu 3. Został zmieniony na ostrzeżenie poziomu 1 w programie Visual Studio 2017 w wersji 15.7. Kod kompilowany bez ostrzeżeń w wersjach kompilatora przed programem Visual Studio 2017 w wersji 15.3 może teraz wygenerować C4834. Aby uzyskać informacje na temat wyłączania ostrzeżeń wprowadzonych w określonej wersji kompilatora lub nowszej, zobacz Ostrzeżenia kompilatora według wersji kompilatora.
Aby wyłączyć ostrzeżenie bez zmian kodu
Ostrzeżenie dla określonego wiersza kodu można wyłączyć przy użyciu warning
pragma , #pragma warning(suppress : 4834)
. Możesz również wyłączyć ostrzeżenie w pliku przy użyciu ostrzeżenia pragma, #pragma warning(disable : 4834)
. Ostrzeżenie można wyłączyć globalnie w kompilacjach wiersza polecenia przy użyciu /wd4834
opcji wiersza polecenia.
Aby wyłączyć ostrzeżenie dotyczące całego projektu w środowisku IDE programu Visual Studio:
- Otwórz okno dialogowe Strony właściwości dla projektu. Aby uzyskać informacje na temat korzystania z okna dialogowego Strony właściwości, zobacz Strony właściwości.
- Wybierz stronę Właściwości>konfiguracji C/C++>Advanced.
- Edytuj właściwość Wyłącz określone ostrzeżenia, aby dodać
4834
element . Wybierz przycisk OK , aby zastosować zmiany.
Przykład
Ten przykład generuje kod C4834 i przedstawia cztery sposoby jego naprawy:
// C4834.cpp
// compile using: cl /EHsc /std:c++17
#include <iostream>
[[nodiscard]]
int square_of(int i) { return i * i; }
int main()
{
square_of(42); // warning C4834: discarding return value of function with 'nodiscard' attribute
// If ignoring the [[nodiscard] attribute is unintentional, make use of the return value as intended:
// For example:
std::cout << "square_of(42) = " << square_of(42) << "\n"; // Ok
// Or:
int result = square_of(43); // Ok
std::cout << "square_of(43) = " << result << "\n";
// If ignoring the [[nodiscard]] attribute value is intentional, you have two options:
// Preferrably, assign the return value to std::ignore:
std::ignore = square_of(42); // Ok, C++11 and higher
// Alternatively, you can cast the return value to void.
// The intent may be less clear to other developers.
(void) square_of(42); // May produce warning C26457
return 0;
}