Namespaces
Variants

std:: ignore

From cppreference.net
Utilities library
ヘッダーで定義 <tuple>
ヘッダーで定義 <utility>
(1)
const /*ignore-type*/ ignore ;
(C++11以降)
(C++14まで)
constexpr /*ignore-type*/ ignore ;
(C++14以降)
(C++17以降はインライン)
(2)
struct /*ignore-type*/

{
template < class T >
const /*ignore-type*/ & operator = ( const T & ) const noexcept
{
return * this ;
}

} ;
(C++11以降)
(C++14まで)
( 説明専用* )
struct /*ignore-type*/

{
template < class T >
constexpr const /*ignore-type*/ & operator = ( const T & ) const noexcept
{
return * this ;
}

} ;
(C++14以降)
( 説明専用* )
1) 任意の値を代入しても効果のないオブジェクト。
2) std::ignore の型。

目次

注記

void 式またはvolatileビットフィールド値を std::ignore に代入することはできません。

std::ignore は、 std::tie と共に std::tuple を展開する際に、使用されない引数のプレースホルダーとして使用することを意図していますが、不要な代入に対して任意に使用することができます。

一部のコーディングガイドでは、代入が必須ではない場合でも、 std::ignore を使用して [[ nodiscard ]] 属性が付いた関数の未使用戻り値による警告を回避することを推奨しています。

値の代入を必要としない無視対象については、 void へのキャストが利用できます。名前はあるが値が使用されない変数については、 void へのキャスト、または [[ maybe_unused ]] 属性を用いた変数宣言が利用できます。

  1. std::ignore の使用法を [[ nodiscard ]] 関数と組み合わせて実演します。
  2. std:: pair < iterator, bool > によって返された std:: set :: insert ( ) をアンパックしますが、ブール値のみを保存します。
#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::ignore std::tie 外での動作が正式に規定されていなかった 完全に規定化

関連項目

(C++11)
左辺値参照の tuple を作成する、またはtupleを個々のオブジェクトに展開する
(関数テンプレート)