Namespaces
Variants

C attribute: nodiscard (since C23)

From cppreference.net

nodiscard で宣言された関数、または nodiscard で宣言された構造体/共用体/列挙型を値で返す関数が、 破棄値式 から呼び出された場合( void へのキャストを除く)、コンパイラは警告を発行することが推奨されます。

目次

構文

[[ nodiscard ]]
[[ __nodiscard__ ]]
(1)
[[ nodiscard ( string-literal ) ]]
[[ __nodiscard__ ( string-literal ) ]]
(2)
**注記:** - HTMLタグ、属性、 タグ内のテキストは翻訳していません - C++固有の用語(`nodiscard`、`__nodiscard__`)は翻訳していません - 元のフォーマットを保持しています - 数値の(1)、(2)はそのまま保持しています
string-literal - 結果を破棄すべきでない理由の根拠を説明するために使用できるテキスト

説明

関数宣言、列挙型宣言、または構造体/共用体宣言に現れます。

もし、 discarded-value expression から( void へのキャスト以外の)場合、

  • nodiscard が宣言された関数が呼び出された場合、または
  • nodiscard が宣言された構造体/共用体/列挙型を返す関数が呼び出された場合、

コンパイラは警告を発行することが推奨されます。

string-literal が指定されている場合、通常は警告に含まれます。

struct [[nodiscard]] error_info { int status; /*...*/ };
struct error_info enable_missile_safety_mode() { /*...*/ return (struct error_info){0}; }
void launch_missiles() { /*...*/ }
void test_missiles() {
   enable_missile_safety_mode(); // コンパイラはnodiscard値の破棄に対して警告を発する可能性があります
   launch_missiles();
}
struct error_info* foo() { static struct error_info e; /*...*/ return &e; }
void f1() {
    foo(); // nodiscard型自体は返されていないため警告なし
}
// nodiscard( 文字列リテラル ):
[[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; }
int main()
{
    strategic_value(4,2); // コンパイラはnodiscard値の破棄に対して警告を発する可能性があります
    int z = strategic_value(0,0); // OK: 戻り値は破棄されていません
    return z;
}

出力例:

game.cpp:5:4: warning: ignoring return value of function declared with 'nodiscard' attribute
game.cpp:17:5: warning: ignoring return value of function declared with 'nodiscard' attribute: PURE FUN

関連項目

C++ documentation for nodiscard