Compartir a través de


Advertencia del compilador (nivel 1) C4834

se descarta el valor devuelto de la función con el atributo "nodiscard"

Comentarios

A partir de C++17 Standard, el atributo [[nodiscard]] especifica que no se planea descartar el valor de una función. Si un autor de llamada descarta el valor devuelto, el compilador genera la advertencia C4834. Aunque este atributo se introdujo en C++17, el compilador respeta este atributo y genera advertencias relacionadas con él cuando se usa /std:c++14 y versiones posteriores.

Para resolver esta advertencia, tenga en cuenta por qué el código no usa el valor devuelto. Es posible que el uso de la función no coincida con su intención. Puede eludir la advertencia asignando el valor a std::ignore o mediante la conversión a void si se descarta el valor es intencionado.
La asignación a std::ignore es preferible sobre la conversión a void en C++11 y versiones posteriores, ya que hace que la intención sea más clara y no desencadenará advertencia C26457 si está habilitada en la configuración de análisis de código.

Esta advertencia se introdujo en la versión 15.3 de Visual Studio 2017 como una advertencia de nivel 3. Se cambió a una advertencia de nivel 1 en la versión 15.7 de Visual Studio 2017. El código que se compilaba sin advertencias en versiones del compilador anteriores a la versión 15.3 de Visual Studio 2017 ahora puede generar la advertencia C4834. Si desea información sobre cómo deshabilitar las advertencias introducidas en una versión determinada del compilador o una versión posterior, consulte Advertencias del compilador por versión del compilador.

Para desactivar la advertencia sin realizar cambios en el código

Para desactivar la advertencia en una línea de código concreta, utilice la pragma warning, #pragma warning(suppress : 4834). También se puede en un archivo mediante utilice la pragma warning, #pragma warning(disable : 4834). La advertencia se puede desactivar globalmente en la compilaciones de la línea de comandos con la opción /wd4834 de la línea de comandos.

Si desea desactivar la advertencia para un proyecto entero en el IDE de Visual Studio:

  1. Abra el diálogo Páginas de propiedades del proyecto. Para obtener información sobre cómo usar el cuadro de diálogo Páginas de propiedades, consulte Páginas de propiedades.
  2. Seleccione la página Propiedades de configuración>C/C++>Avanzadas.
  3. Edite la propiedad Deshabilitar advertencias específicas para agregar 4834. Seleccione Aceptar para aplicar los cambios.

Ejemplo

Este ejemplo genera la advertencia C4834 y muestra cuatro maneras de corregirlo:

// 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;
}