1. ホーム
  2. c++

[解決済み] std::ignoreと構造化バインディング?

2022-12-28 20:14:39

質問

前奏曲です。

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 コメントがあることに注意してください ( P0488R0 US100)。

<ブロッククオート

分解宣言は、返された値のいくつかを破棄する構文を提供する必要があり、ちょうど std::tiestd::ignore .