C++標準ライブラリにおけるnodiscard
属性の使われ方についてメモ。
関数戻り値の誤った破棄を警告する目的でC++17言語仕様に導入された。標準ライブラリではC++2a(C++20)からの利用となる。2018年8月現在、下記関数がnodiscard
属性付与対象となっている。
operator new
,operator new[]
- 標準アロケータの
allocate
メンバ関数 - 標準コンテナ(文字列系含む)の
empty
メンバ関数 std::async
関数(→id:yohhoy:20120317, id:yohhoy:20140315)std::launder
関数(→id:yohhoy:20170817)
C++標準ライブラリ中でのnodiscard
利用に関する提案文書P0600R1では、下記の基本ルールを定めている。
- 属性付与すべきケース:
- 戻り値の未使用が常に “重大なミス(huge mistake)” となるケースに付与する。メモリ確保系の関数。
- 戻り値の未使用がトラブルの元となり、かつ容易に起こりうるケースに付与する。
empty
,async
,lanuder
などはこちら。
- 属性付与すべきでないケース:
- 一部の入力値に対しては戻り値未使用が合理的であるケースには付与しない。
realloc
へのサイズ0指定など(free
相当の動作)。 - 戻り値の未使用は無意味だが実害が無く、通常は失敗しないケースには付しない。printf系, コンテナアダプタの
top
, スマートポインタのrelease
など。 - Cライブラリ互換APIには付与しない。
malloc
は対象外。
- 一部の入力値に対しては戻り値未使用が合理的であるケースには付与しない。
関連URL
- (PDF)P0600R1 [[nodiscard]] in the Library, Rev1
- cppreference nodiscard, cpprefjp [[nodiscard]]属性
- Trip report: Winter ISO C++ standards meeting