前奏曲:
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();
新しい構造化バインディング構文を使用して同様のことを行うことは可能ですか?どのように機能しますか?
構造化バインディングの提案には、質問に答える専用セクションが含まれています( 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::tie
がstd::ignore
を使用するように、返された値の一部を破棄する構文を提供する必要があります。
新しい構造化バインディング構文を使用して同様のことを行うことは可能ですか?
いいえ。後で言及しない変数名を作成する必要があります。