Avviso del compilatore (livello 1) C4834
eliminazione del valore restituito della funzione con l'attributo 'nodiscard'
Osservazioni:
A partire da C++17 Standard, l'attributo [[nodiscard]]
specifica che il valore restituito di una funzione non deve essere rimosso. Se un chiamante rimuove il valore restituito, il compilatore genera l'avviso C4834. Anche se questo attributo è stato introdotto in C++17, il compilatore rispetta questo attributo e genera avvisi correlati quando si usa /std:c++14
e versioni successive.
Per risolvere questo avviso, considerare il motivo per cui il codice non usa il valore restituito. L'uso della funzione potrebbe non corrispondere alla finalità. È possibile aggirare l'avviso assegnando il valore a std::ignore
o eseguendo il cast a void
se l'eliminazione del valore è intenzionale.
L'assegnazione a std::ignore
è preferibile rispetto al cast a void
in C++11 e versioni successive, in quanto rende più chiara la finalità e non attiverà l'avviso C26457 se abilitato nelle impostazioni di analisi del codice.
Questo avviso è stato introdotto in Visual Studio 2017 versione 15.3 come avviso di livello 3. È stato modificato in un avviso di livello 1 in Visual Studio 2017 versione 15.7. Il codice compilato senza avvisi nelle versioni del compilatore prima di Visual Studio 2017 versione 15.3 può ora generare C4834. Per informazioni su come disabilitare gli avvisi introdotti in una determinata versione del compilatore o versioni successive, vedere Avvisi del compilatore per versione del compilatore.
Per disattivare l'avviso senza modifiche al codice
È possibile disattivare l'avviso per una riga di codice specifica usando il warning
pragma , #pragma warning(suppress : 4834)
. È anche possibile disattivare l'avviso all'interno di un file usando il pragma di avviso , #pragma warning(disable : 4834)
. È possibile disattivare l'avviso a livello globale nelle compilazioni della riga di comando usando l'opzione della /wd4834
riga di comando.
Per disattivare l'avviso per un intero progetto nell'IDE di Visual Studio:
- Aprire la finestra di dialogo Pagine delle proprietà per il progetto. Per informazioni su come usare la finestra di dialogo Pagine delle proprietà, vedere Pagine delle proprietà.
- Selezionare la pagina Proprietà>di configurazione C/C++>Avanzate.
- Modificare la proprietà Disabilita avvisi specifici per aggiungere
4834
. Scegliere OK per applicare le modifiche.
Esempio
Questo esempio genera l'errore C4834 e mostra quattro modi per risolverlo:
// 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;
}