Namespaces
Variants

C++ attribute: nodiscard (since C++17)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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

標準ライブラリ

以下の標準関数は nodiscard 属性で宣言されています:

拡張コンテンツ
アロケート関数
メモリ確保関数
(関数)
未初期化の記憶域を割り当てる
( std::allocator<T> の公開メンバー関数)
[static]
アロケータを使用して未初期化のストレージを割り当てる
( std::allocator_traits<Alloc> のpublic staticメンバー関数)
メモリを割り当てる
( std::pmr::memory_resource の 公開メンバー関数)
メモリを確保
( std::pmr::polymorphic_allocator<T> の 公開メンバ関数)
外部アロケータを使用して未初期化ストレージを割り当てる
( std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...> の公開メンバー関数)
間接アクセス
(C++17)
ポインター最適化バリア
(関数テンプレート)
ポインタがアラインされていることをコンパイラに通知する
(関数テンプレート)
空チェック関数
(C++17)
コンテナが空かどうかをチェックする
(関数テンプレート)
node handleが空かどうかをチェックする
( node handle のpublicメンバー関数)
コンテナが空かどうかをチェックする
( std::array<T,N> の 公開メンバー関数)
文字列が空かどうかをチェックする
( std::basic_string<CharT,Traits,Allocator> の公開メンバー関数)
ビューが空かどうかをチェックする
( std::basic_string_view<CharT,Traits> の公開メンバー関数)
コンテナが空かどうかをチェックする
( std::deque<T,Allocator> の公開メンバー関数)
コンテナが空かどうかをチェックする
( std::forward_list<T,Allocator> の公開メンバー関数)
コンテナが空かどうかをチェックする
( std::list<T,Allocator> の 公開メンバー関数)
コンテナが空かどうかをチェックする
( std::map<Key,T,Compare,Allocator> の公開メンバー関数)
マッチが成功したかどうかをチェックする
( std::match_results<BidirIt,Alloc> の 公開メンバー関数)
コンテナが空かどうかをチェックする
( std::multimap<Key,T,Compare,Allocator> の公開メンバー関数)
コンテナが空かどうかをチェックする
( std::multiset<Key,Compare,Allocator> の公開メンバー関数)
コンテナアダプタが空かどうかをチェックする
( std::priority_queue<T,Container,Compare> の公開メンバ関数)
コンテナアダプタが空かどうかをチェックする
( std::queue<T,Container> の 公開メンバ関数)
コンテナが空かどうかをチェックする
( std::set<Key,Compare,Allocator> の公開メンバー関数)
シーケンスが空かどうかをチェックする
( std::span<T,Extent> の公開メンバ関数)
コンテナアダプタが空かどうかをチェックする
( std::stack<T,Container> の公開メンバー関数)
コンテナが空かどうかをチェックする
( std::unordered_map<Key,T,Hash,KeyEqual,Allocator> の 公開メンバー関数)
コンテナが空かどうかをチェックする
( std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator> の公開メンバー関数)
コンテナが空かどうかをチェックする
( std::unordered_multiset<Key,Hash,KeyEqual,Allocator> の 公開メンバー関数)
コンテナが空かどうかをチェックする
( std::unordered_set<Key,Hash,KeyEqual,Allocator> の 公開メンバ関数)
コンテナが空かどうかをチェックする
( std::vector<T,Allocator> の公開メンバー関数)
パスが空かどうかをチェックする
( std::filesystem::path の 公開メンバ関数)
その他
(C++11)
関数を非同期で(場合によっては新しいスレッドで)実行し、結果を保持する std::future を返す
(関数テンプレート)
(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