C++ attribute: nodiscard (since C++17)
nodiscard
で宣言された関数、または
nodiscard
で宣言された列挙型やクラスを値で返す関数が、
破棄値式
から呼び出された場合(
void
へのキャストを除く)、コンパイラは警告を発行することが推奨されます。
目次 |
構文
[
[
nodiscard
]
]
|
(1) | (C++17以降) | |||||||
[
[
nodiscard
(
文字列リテラル
)
]
]
|
(2) | (C++20以降) | |||||||
| string-literal | - | 結果を破棄すべきでない理由の根拠を説明するために使用できる unevaluated string literal |
説明
関数宣言、列挙型宣言、またはクラス宣言内に現れます。
もし、 discarded-value expression から( void へのキャスト以外の)場合、
-
nodiscardが宣言された関数が呼び出された場合、または -
nodiscardが宣言された列挙型またはクラスを値で返す関数が呼び出された場合、または -
nodiscardが宣言されたコンストラクタが 明示的型変換 または static_cast によって呼び出された場合、または -
nodiscardが宣言された列挙型またはクラス型のオブジェクトが 明示的型変換 または static_cast によって初期化された場合、
コンパイラは警告を発行することが推奨されます。
|
string-literal が指定された場合、通常は警告に含まれます。 |
(C++20以降) |
例
struct [[nodiscard]] error_info { /*...*/ }; error_info enable_missile_safety_mode() { /*...*/ return {}; } void launch_missiles() { /*...*/ } void test_missiles() { enable_missile_safety_mode(); // nodiscard値の破棄に対してコンパイラが警告を発する可能性があります launch_missiles(); } error_info& foo() { static error_info e; /*...*/ return e; } void f1() { foo(); } // nodiscard型が値で返されていないため警告なし // nodiscard( 文字列リテラル ) (C++20以降): [[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; } int main() { strategic_value(4, 2); // nodiscard値の破棄に対してコンパイラが警告を発する可能性があります auto 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++26まで) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| P1771R1 | C++17 |
[[nodiscard]]
コンストラクタでは効果がない
|
構築されたオブジェクトが破棄された場合に警告を発生させる可能性がある |
参考文献
- C++23標準 (ISO/IEC 14882:2024):
-
- 9.12.9 Nodiscard属性 [dcl.attr.nodiscard]
- C++20 標準 (ISO/IEC 14882:2020):
-
- 9.12.8 Nodiscard 属性 [dcl.attr.nodiscard]
- C++17標準 (ISO/IEC 14882:2017):
-
- 10.6.7 Nodiscard属性 [dcl.attr.nodiscard]
関連項目
|
(C++11)
|
tuple
の要素をアンパックする際にスキップするためのプレースホルダ
tie
を使用して
(定数) |
|
Cドキュメント
for
nodiscard
|
|