名前空間
変種
操作

C++ 属性: nodiscard (C++17 以降)

From cppreference.com
< cpp‎ | language‎ | attributes
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 
属性
(C++23)
(C++11)(C++26 まで)
(C++14)
(C++20)
nodiscard
(C++17)
(C++11)
(C++20)
 

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

標準ライブラリ

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

拡張コンテンツ
アロケーション関数
メモリ割り当て関数
(関数) [編集]
未初期化のストレージを割り当てる
(std::allocator<T> の public メンバー関数) [編集]
[static]
アロケータを使用して未初期化のストレージを割り当てる
(std::allocator_traits<Alloc> の public static メンバー関数) [編集]
メモリを割り当てる
(std::pmr::memory_resource の public メンバー関数) [編集]
メモリを割り当てる
(std::pmr::polymorphic_allocator<T> の public メンバー関数) [編集]
外側のアロケータを使用して未初期化のストレージを割り当てる
(std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...> の public メンバー関数) [編集]
間接アクセス
(C++17)
ポインタ最適化の障壁
(関数テンプレート) [編集]
ポインタがアラインされていることをコンパイラに伝えます
(関数テンプレート) [編集]
空かどうかのチェック関数
(C++17)
コンテナが空かどうかをチェックする
(function template) [編集]
ノードハンドルが空かどうかをチェックする
(node handle の public メンバー関数)
コンテナが空かどうかをチェックする
(std::array<T,N> の public メンバー関数) [編集]
文字列が空かどうかをチェックする
(std::basic_string<CharT,Traits,Allocator> の public メンバー関数) [編集]
ビューが空かどうかをチェックする
(std::basic_string_view<CharT,Traits> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::deque<T,Allocator> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::forward_list<T,Allocator> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::list<T,Allocator> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::map<Key,T,Compare,Allocator> の public メンバー関数) [編集]
マッチが成功したかどうかをチェックする
(std::match_results<BidirIt,Alloc> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::multimap<Key,T,Compare,Allocator> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::multiset<Key,Compare,Allocator> の public メンバー関数) [編集]
コンテナアダプタが空かどうかをチェックする
(std::priority_queue<T,Container,Compare> の public メンバー関数) [編集]
コンテナアダプタが空かどうかをチェックする
(std::queue<T,Container> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::set<Key,Compare,Allocator> の public メンバー関数) [編集]
シーケンスが空かどうかをチェックする
(std::span<T,Extent> の public メンバー関数) [編集]
コンテナアダプタが空かどうかをチェックする
(std::stack<T,Container> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::unordered_map<Key,T,Hash,KeyEqual,Allocator> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::unordered_multimap<Key,T,Hash,KeyEqual,Allocator> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::unordered_multiset<Key,Hash,KeyEqual,Allocator> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::unordered_set<Key,Hash,KeyEqual,Allocator> の public メンバー関数) [編集]
コンテナが空かどうかをチェックする
(std::vector<T,Allocator> の public メンバー関数) [編集]
パスが空かどうかをチェックする
(std::filesystem::path の public メンバー関数) [編集]
その他
(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 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 をアンパックするときに要素をスキップするプレースホルダー
(定数) [編集]
English 日本語 中文(简体) 中文(繁體)