Aviso do compilador (nível 1) C4834
descartando o valor retornado da função com o atributo 'nodiscard'
Comentários
A partir do C++17 Standard, o atributo [[nodiscard]]
especifica que o valor retornado de uma função não se destina a ser descartado. Se um chamador descartar o valor retornado, o compilador gerará um aviso C4834. Embora esse atributo tenha sido introduzido no C++17, o compilador respeita esse atributo e gera avisos relacionados a ele ao usar /std:c++14
e posteriormente.
Para resolver esse aviso, considere por que seu código não usa o valor retornado. O uso da função pode não corresponder à sua intenção. Você pode contornar o aviso atribuindo o valor ou std::ignore
convertendo-o para void
se o descarte do valor for intencional.
A atribuição a std::ignore
é preferível à conversão para void
no C++11 e superior, pois torna sua intenção mais clara e não disparará o Aviso C26457 se habilitado em suas configurações de análise de código.
Esse aviso foi introduzido no Visual Studio 2017 versão 15.3 como um aviso de nível 3. Ele foi alterado para um aviso de nível 1 no Visual Studio 2017 versão 15.7. O código compilado sem avisos em versões do compilador antes do Visual Studio 2017 versão 15.3 agora pode gerar C4834. Para obter informações sobre como desabilitar avisos introduzidos em uma versão específica do compilador ou posterior, consulte avisos do compilador por versão do compilador.
Para desativar o aviso sem alterações de código
Você pode desativar o aviso em uma linha de código específica usando o pragma warning
, #pragma warning(suppress : 4834)
. Você também pode desativar o aviso dentro de um arquivo usando o pragma de aviso, #pragma warning(disable : 4834)
. Para desativar o aviso globalmente em builds de linha de comando, use a opção de linha de comando /wd4834
.
Para desativar o aviso de um projeto inteiro no IDE do Visual Studio:
- Abra a caixa de diálogo Páginas de Propriedades do seu projeto. Para obter informações sobre como usar a caixa de diálogo Páginas de Propriedades, consulte Páginas de Propriedades.
- Selecione a página Propriedades de Configuração>C/C++>Avançadas.
- Edite a propriedade Desabilitar Avisos Específicos para adicionar
4834
. Escolha OK para aplicar suas alterações.
Exemplo
Este exemplo gera C4834 e mostra quatro maneiras de corrigi-lo:
// 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;
}