次の方法で共有


コンパイラ警告 (レベル 1) C4834

'nodiscard' 属性を持つ関数の戻り値を破棄しています

解説

C++ 17 Standard 以降では、[[nodiscard]] 属性は、関数の戻り値が破棄されることを意図していないことを指定します。 呼び出し元が戻り値を破棄すると、コンパイラによって警告 C4834 が生成されます。 この属性は C++17 で導入されましたが、コンパイラはこの属性を考慮し、使用 /std:c++14 後に関連する警告を生成します。

この警告を解決するには、コードが戻り値を使用していない理由を検討してください。 関数の使用がその意図と一致しない可能性があります。 警告を回避するには、値std::ignoreを割り当てるか、値が意図的である場合はキャストvoidカードキャストします。
std::ignore割り当ては C++11 以降でキャストvoidするよりも優先されます。これは、意図がより明確になり、コード分析設定で有効になっている場合に警告 C26457 がトリガーされないためです。

この警告は、レベル 3 の警告として Visual Studio 2017 バージョン15.3 で導入されました。 Visual Studio 2017 バージョン15.7 では、レベル 1 の警告に変更されました。 Visual Studio 2017 バージョン 15.3 以前のコンパイラ バージョンで警告を出さずにコンパイルしたコードが C4834 を生成することがあります。 特定のコンパイラ バージョン以降で導入された警告を無効にする方法については、「コンパイラのバージョン別のコンパイラの警告」を参照してください。

コードを変更せずに警告をオフにするには

warning pragma、#pragma warning(suppress : 4834) を使うことで、特定のコード行に対する警告をオフにできます。 また、警告の pragma である #pragma warning(disable : 4834) を使用することで、ファイル内の警告をオフにできます。 コマンドライン ビルドでは、/wd4834 コマンド ライン オプションを使用して警告をグローバルにオフにできます。

Visual Studio IDE でプロジェクト全体の警告をオフにするには、次のようにします:

  1. プロジェクトの [プロパティ ページ] ダイアログを開きます。 [プロパティ ページ] ダイアログの使用方法の詳細については、プロパティ ページを参照してください。
  2. [構成プロパティ] > [C/C++] > [詳細] ページを選択します。
  3. [特定の警告を無効にする] プロパティを編集して 4834 を追加します。 [OK] をクリックして変更を適用します。

このサンプルでは C4834 が生成され、それを修正する 4 つの方法が示されています。

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