C++ 属性: nodiscard (C++17 以降)
From cppreference.com
< cpp | language | attributes
nodiscard と宣言された関数、または nodiscard と宣言された列挙型やクラスを値で返す関数が、void へのキャスト以外の破棄値式から呼び出された場合、コンパイラは警告を発することが推奨されます。
目次 |
[編集] 構文
[[nodiscard]]
|
(1) | (C++17以降) | |||||||
[[nodiscard( string-literal )]] |
(2) | (C++20以降) | |||||||
| string-literal | - | 結果が破棄されるべきではない理由を説明するために使用できる未評価の文字列リテラル |
[編集] 説明
関数宣言、列挙宣言、またはクラス宣言に現れます。
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(); // compiler may warn on discarding a nodiscard value launch_missiles(); } error_info& foo() { static error_info e; /*...*/ return e; } void f1() { foo(); } // nodiscard type is not returned by value, no warning // nodiscard( string-literal ) (since C++20): [[nodiscard("PURE FUN")]] int strategic_value(int x, int y) { return x ^ y; } int main() { strategic_value(4, 2); // compiler may warn on discarding a nodiscard value auto z = strategic_value(0, 0); // OK: return value is not discarded 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 standard (ISO/IEC 14882:2020)
- 9.12.8 Nodiscard 属性 [dcl.attr.nodiscard]
- C++17 standard (ISO/IEC 14882:2017)
- 10.6.7 Nodiscard 属性 [dcl.attr.nodiscard]
[編集] 関連項目
| (C++11) |
tie を使用して tuple をアンパックするときに要素をスキップするプレースホルダー(定数) |
| nodiscard のC ドキュメント
| |