Compilerwarnung (Stufe 1) C4834
Der Rückgabewert einer Funktion mit dem "nodiscard"-Attribut wird verworfen.
Hinweise
Ab C++17 Standard gibt das Attribut an, dass der [[nodiscard]]
Rückgabewert einer Funktion nicht verworfen werden soll. Wenn ein Aufrufer den Rückgabewert verwirft, generiert der Compiler die Warnung C4834. Obwohl dieses Attribut in C++17 eingeführt wurde, berücksichtigt der Compiler dieses Attribut und generiert Warnungen im Zusammenhang mit dem Attribut bei Verwendung /std:c++14
und höher.
Um diese Warnung zu beheben, sollten Sie berücksichtigen, warum Ihr Code den Rückgabewert nicht verwendet. Ihre Verwendung der Funktion entspricht möglicherweise nicht ihren Absichten. Sie können die Warnung umgehen, indem Sie den Wert std::ignore
zuweisen oder ihn void
umwandeln, wenn der Wert verworfen wird.
Die Zuweisung zu std::ignore
der Aufgabe wird gegenüber der Umwandlung void
in C++11 und höher bevorzugt, da sie ihre Absicht klarer macht und Warnung C26457 nicht auslöst, wenn sie in ihren Codeanalyseeinstellungen aktiviert ist.
Diese Warnung wurde in Visual Studio 2017, Version 15.3, als Warnung der Ebene 3 eingeführt. Sie wurde in Visual Studio 2017, Version 15.7, in eine Warnung der Ebene 1 geändert. Code, der ohne Warnungen in Versionen des Compilers vor Visual Studio 2017, Version 15.3 kompiliert wurde, kann jetzt C4834 generieren. Informationen zum Deaktivieren von Warnungen, die in einer bestimmten Compilerversion oder höher eingeführt wurden, finden Sie unter Compilerwarnungen nach Compilerversion.
So deaktivieren Sie die Warnung ohne Codeänderungen
Sie können die Warnung für eine bestimmte Codezeile mithilfe des warning
Pragmas #pragma warning(suppress : 4834)
deaktivieren. Sie können die Warnung in einer Datei auch mit dem Pragma #pragma warning(disable : 4834)
der Warnung deaktivieren. Sie können die Warnung global in Befehlszeilenbuilds mithilfe der /wd4834
Befehlszeilenoption deaktivieren.
So deaktivieren Sie die Warnung für ein gesamtes Projekt in der Visual Studio-IDE:
- Öffnen Sie das Dialogfeld Eigenschaftenseiten für Ihr Projekt. Informationen zur Verwendung des Dialogfelds „Eigenschaftenseiten“ finden Sie unter Eigenschaftenseiten.
- Wählen Sie die Seite "Konfigurationseigenschaften>C/C++>Erweitert" aus.
- Bearbeiten Sie die Eigenschaft Bestimmte Warnungen deaktivieren, um
4834
hinzuzufügen. Klicken Sie auf OK, um die Änderungen zu übernehmen.
Beispiel
In diesem Beispiel wird C4834 generiert, und es werden vier Möglichkeiten zum Beheben gezeigt:
// 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;
}