web-dev-qa-db-ja.com

std :: ignore構造化バインディングで?

前奏曲:

std::Tuple<int, int, int> f();
std::Tuple<int, int, float, int> g();

C++ 1zは、構造化されたバインディングの構文を導入します。これにより、

int a, b, c;
std::tie(a, b, c) = f();

何かのようなもの

auto [a, b, c] = f();

ただし、std::tieでは、特定のコンポーネントを無視するためにstd::ignoreを指定することもできます。例:

std::tie(a, b, std::ignore, c) = g();

新しい構造化バインディング構文を使用して同様のことを行うことは可能ですか?どのように機能しますか?

55
jotik

構造化バインディングの提案には、質問に答える専用セクションが含まれています( P0144R2 ):

3.8コンポーネントを明示的に無視する方法はありますか?

動機は、未使用の名前に関するコンパイラの警告を止めることです。答えは「まだ」ではないと思います。これはユースケースに動機付けられておらず(コンパイラの警告を消すことは動機付けですが、ユースケースそれ自体ではありません)、このコンテキストでこれを再検討できるまで残しておくのが最善ですこれは特別なケースとして除外される、より一般的なパターンマッチングの提案です。

std::tieとの対称性は、std::ignoreのようなものの使用を提案します。

Tuple<T1,T2,T3> f();

auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element

しかし、これは気まずい感じがします。

言語でパターンマッチングを予測すると、_*のようなワイルドカードが提案されますが、まだパターンマッチングがないため、互換性があるとわかっている構文を選択するのは時期尚早です。これは、パターンマッチングで考慮されるのを待つことができる純粋な拡張です。

ただし、標準のワーキングドラフトは現在、関連する国立機関(NB)によって改訂されており、この機能を要求するNBコメントがあります( P0488R 、US100):

分解宣言は、std::tiestd::ignoreを使用するように、返された値の一部を破棄する構文を提供する必要があります。

39
metalfox

新しい構造化バインディング構文を使用して同様のことを行うことは可能ですか?

いいえ。後で言及しない変数名を作成する必要があります。

6
Nicol Bolas