Udostępnij za pośrednictwem


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:

  1. 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.
  2. Wybierz stronę Właściwości>konfiguracji C/C++>Advanced.
  3. Edytuj właściwość Wyłącz określone ostrzeżenia, aby dodać 4834element . 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;
}