std::ignore
From cppreference.com
| ヘッダ <tuple> で定義 |
||
| ヘッダ <utility> で定義 |
||
| (1) | ||
const /*ignore-type*/ ignore; |
(C++11以降) (C++14まで) |
|
| constexpr /*ignore-type*/ ignore; |
(C++14以降) (C++17以降inline) |
|
| (2) | ||
struct /*ignore-type*/ { |
(C++11以降) (C++14まで) (説明用*) |
|
| struct /*ignore-type*/ { |
(C++14以降) (説明用*) |
|
1) あらゆる値を代入しても効果がないオブジェクト。
2)
std::ignoreの型。目次 |
[編集] 備考
void 式または揮発性ビットフィールド値はstd::ignoreに代入できません。
std::ignoreは、std::tupleをアンパックする際に使用されない引数のプレースホルダーとしてstd::tieと一緒に使用することを意図していますが、不要な代入にも使用できます。
一部のコードガイドでは、代入が必須ではないにもかかわらず、[[nodiscard]]関数の未使用の戻り値による警告を回避するためにstd::ignoreを使用することを推奨しています。
代入が不要な値を無視するには、voidにキャストできます。名前はあるが値が使用されていない変数の場合、それらをvoidにキャストするか、[[maybe_unused]]でそれらの変数を宣言できます。
[編集] 例
std::ignoreと[[nodiscard]]関数の使用方法を示します。- std::set::insert()が返すstd::pair<iterator, bool>をアンパックしますが、ブール値のみを保存します。
このコードを実行
#include <iostream> #include <set> #include <string> #include <tuple> [[nodiscard]] int dontIgnoreMe() { return 42; } int main() { std::ignore = dontIgnoreMe(); std::set<std::string> set_of_str; if (bool inserted{false}; std::tie(std::ignore, inserted) = set_of_str.insert("Test"), inserted) std::cout << "Value was inserted successfully.\n"; }
出力
Value was inserted successfully.
[編集] 欠陥レポート
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2773 | C++14 | std::tupleはconstexprになりましたが、std::ignoreはまだ |
constexprではありませんでした。 |
| P2968R2 | C++11 | std::tie以外のstd::ignoreの動作は正式に指定されていませんでした。 |
完全に指定されました。 |
[編集] 関連項目
| (C++11) |
左辺値参照のtupleを生成するか、タプルを個別のオブジェクトにアンパックする (関数テンプレート) |