属性: nodiscard (C++17以上)
提供: cppreference.com
< cpp | language | attributes
nodiscard 宣言された関数、または nodiscard 宣言された列挙またはクラスを値返しする関数が、 void へのキャスト以外の値を破棄する式から呼ばれた場合、コンパイラは警告を発することが推奨されます。
目次 |
[編集] 構文
[[nodiscard]]
|
(1) | ||||||||
[[nodiscard( string-literal )]]
|
(2) | (C++20以上) | |||||||
string-literal | - | 戻り値を破棄すべきでない論拠を説明するために使用できるテキスト |
[編集] 説明
関数宣言、列挙宣言、またはクラス宣言に現れます。
void へのキャスト以外の値を破棄する式から
- nodiscard 宣言された関数が呼ばれた、または
- nodiscard 宣言された列挙またはクラスを値返しする関数が呼ばれた、または
- nodiscard 宣言されたコンストラクタが明示的な型変換または static_cast によって呼ばれた、または
- nodiscard 宣言された列挙またはクラス型のオブジェクトが明示的な型変換または static_cast によって初期化された
場合、コンパイラは警告を発行することが推奨されます。
string-literal (もし指定された場合) は、通常、警告に含まれます。 |
(C++20以上) |
[編集] 例
Run this code
struct [[nodiscard]] error_info { }; error_info enable_missile_safety_mode(); void launch_missiles(); void test_missiles() { enable_missile_safety_mode(); // nodiscard な値の破棄をコンパイラが警告するかもしれません。 launch_missiles(); } error_info& foo(); void f1() { foo(); // nodiscard な型ですが、値で返されていないため、警告はありません。 }
[編集] 欠陥報告
以下の動作変更欠陥報告は以前に発行された C++ 標準に遡って適用されました。
DR | 適用先 | 発行時の動作 | 正しい動作 |
---|---|---|---|
P1771R1 | C++17 | nodiscard on constructors has no effect | can cause a warning if the constructed object is discarded |
[編集] 標準ライブラリ
以下の標準ライブラリの関数は nodiscard
属性付きで宣言されます。
確保関数 | |
確保関数 (関数) | |
未初期化記憶域を確保します ( std::allocator<T> のパブリックメンバ関数)
| |
[静的] |
アロケータを使用して未初期化記憶域を確保します ( std::allocator_traits<Alloc> のパブリック静的メンバ関数)
|
メモリを確保します ( std::pmr::memory_resource のパブリックメンバ関数)
| |
メモリを確保します ( std::pmr::polymorphic_allocator<T> のパブリックメンバ関数)
| |
外側のアロケータを使用して未初期化記憶域を確保します ( std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...> のパブリックメンバ関数)
| |
間接アクセス | |
(C++17) |
ポインタ最適化バリア (関数テンプレート) |
(C++20) |
ポインタがアラインされていることをコンパイラに伝えます (関数テンプレート) |
空かどうか調べる関数 | |
(C++17) |
コンテナが空かどうか調べます (関数) |
ノードハンドルが空かどうか調べます ( node handle のパブリックメンバ関数)
| |
コンテナが空かどうか調べます ( 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 を返します (関数テンプレート) |