C++1z 戻り値を捨ててはならないことを指定する[[nodiscard]]属性

C++1zから、関数の戻り値をユーザーに無視しないでほしい場合に指定する[[nodiscard]]属性が導入されます。

この属性は、エラーが起きた状態でエラーを無視して正常として処理を続けないでほしいような状況で使用します。

struct error_info { … };

// 関数f()の戻り値は必ず使用すること
[[nodiscard]] error_info f();

int main()
{
    f(); // 戻り値を捨てている。(コンパイル時に警告が出力されることになるだろう)
}

エラー以外で使用する状況としては、以下のようなものが考えられます:

  • 自分自身を書き換えるのではなく、新しいオブジェクトを作って返すような関数
    • たとえば string replace(string origin, string old, string new); のような文字列の置換をする関数において、元となる文字列オブジェクトを書き換えるのではなく、置き換えた結果の新しい文字列を返すような場合。この場合、戻り値を使わないと単に無駄な処理になり、意図したコードではない可能性が高い
  • 戻り値を使って継続的な処理を行うような関数
    • futureを返す非同期処理の関数は、戻り値を無視すると即座にfutureのデストラクタが実行されて処理がブロッキングされるので、意図した処理ではない可能性が高い

この属性は、以下の要素に対して指定できます:

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

[[nodiscard]]が指定された戻り値が使用されなかった場合、コンパイル時に警告が出力されることになるでしょう。

C++1z時点で、標準ライブラリに[[nodiscard]]が付く機能はとくにありません。

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。