Поделиться через


Предупреждение компилятора (уровень 1) C4834

отмена возвращаемого значения функции с атрибутом nodiscard

Замечания

Начиная с C++17 Standard атрибут [[nodiscard]] указывает, что возвращаемое значение функции не предназначено для удаления. Если вызывающий объект удаляет возвращаемое значение, компилятор создает предупреждение C4834. Хотя этот атрибут был введен в C++17, компилятор учитывает этот атрибут и создает предупреждения, связанные с ним при использовании и более поздних версиях /std:c++14 .

Чтобы устранить это предупреждение, рассмотрите, почему код не использует возвращаемое значение. Использование функции может не соответствовать его намерению. Вы можете обойти предупреждение, назначив значение std::ignore или приведя его к void удалению значения намеренно.
std::ignore Назначение предпочтительнее приведения void в C++11 и более поздних версиях, так как оно делает намерение более понятным и не активирует предупреждение C26457, если включено в параметрах анализа кода.

Это предупреждение было введено в Visual Studio 2017 версии 15.3 как предупреждение уровня 3. Оно было изменено на предупреждение уровня 1 в Visual Studio 2017 версии 15.7. Код, скомпилированный без предупреждений в версиях компилятора до Visual Studio 2017 версии 15.3, теперь может создавать C4834. Сведения об отключении предупреждений, представленных в определенной версии компилятора или более поздней версии, см. в разделе "Предупреждения компилятора" по версии компилятора.

Отключение предупреждения без изменений кода

Предупреждение для определенной строки кода можно отключить с помощью warning pragma. #pragma warning(suppress : 4834) Вы также можете отключить предупреждение в файле с помощью предупреждения pragma. #pragma warning(disable : 4834) Вы можете отключить предупреждение глобально в сборках командной строки с помощью параметра командной /wd4834 строки.

Чтобы отключить предупреждение для всего проекта в интегрированной среде разработки Visual Studio, выполните следующие действия.

  1. Откройте диалоговое окно "Страницы свойств" для проекта. Сведения об использовании диалогового окна "Страницы свойств" см. в разделе "Страницы свойств".
  2. Выберите страницу "Свойства>конфигурации" C/C++>Advanced.
  3. Измените свойство Disable Specific Warnings to add 4834. Нажмите кнопку "ОК ", чтобы применить изменения.

Пример

В этом примере создается C4834 и показаны четыре способа ее устранения:

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