Предупреждение компилятора (уровень 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, выполните следующие действия.
- Откройте диалоговое окно "Страницы свойств" для проекта. Сведения об использовании диалогового окна "Страницы свойств" см. в разделе "Страницы свойств".
- Выберите страницу "Свойства>конфигурации" C/C++>Advanced.
- Измените свойство 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;
}