最終更新日時:
が更新

履歴 編集

[[nodiscard]]属性(C++17)

概要

[[nodiscard]]属性は関数の戻り値を破棄してはならないことをコンパイラに伝え、破棄した場合に警告するための属性である。

例えばエラーを無視して処理を続行してはならない関数があったとき、プログラマが間違えてエラーを無視してしまった場合に、コンパイル時に警告を発生させることができる。

従来は戻り値の破棄に対して警告を発生させる方法がコンパイラごとに異なり、標準的な方法はなかった。C++17では[[nodiscard]]属性により戻り値を破棄してはならないことをコンパイラに伝え、警告を発生させられる。

仕様

[[nodiscard]]属性は、以下の要素に対して指定できる。

  • 関数宣言
  • クラスもしくは列挙型の宣言

//無視してはいけないデータ型
struct [[nodiscard]] error_info { /*...*/ };

error_info safety_mode();
void launch();

//関数の戻り値を必ず使用すること
[[nodiscard]] int check_mode();

void test_missiles() {
  safety_mode(); //無視してはいけない型を無視したため、警告が発生するだろう
  launch();

  check_mode(); //戻り値を無視しているため、警告が発生するだろう
}

出力

clang++ 5.0.0 にてコンパイルした場合。

nodiscard.cpp:12:3: warning: ignoring return value of function declared with 'nodiscard' attribute [-Wunused-result]
  safety_mode(); //無視してはいけない型を無視したため、警告が発生するだろう
  ^~~~~~~~~~~
nodiscard.cpp:15:3: warning: ignoring return value of function declared with 'nodiscard' attribute [-Wunused-result]
  check_mode(); //戻り値を無視しているため、警告が発生するだろう
  ^~~~~~~~~~
2 warnings generated.

関連項目

参照