std ::構造化バインディングを無視しますか?


87

前奏曲:

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();

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


2
そこに任意の名前を付けるだけです。
N。「代名詞」m。

1
@nmは任意の名前でコピーを作成しませんか?
Piotr Skotnicki 2016年

1
@Piotrコピー数はstd::ignore、より多くないと思います。コピーの省略が保証されているため、ダミー変数が初期化されます。を使用するとstd::tie、への割り当てのrhsにある一時std::ignoreが初期化されます。
j6t 2016年

1
auto[IGNORE]一意の名前を生成するマクロを持つことができます(例:コンパイラ固有のCOUNTERまたはLINEを使用)。それは十分に読みやすく、実際にはのようstd::ignoreに機能しstd::tieます。
KABoissonneault 2016年

2
@PiotrSkotnickiいいえ、decomp宣言が作成する唯一のコピーは、分解されているものです。宣言されているものは、そのもののメンバー/要素へのエイリアスか、get返されるものにバインドする参照のいずれかです。
TC

回答:


62

構造化バインディングの提案には、質問に答える専用のセクションが含まれています(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::tie使用するのと同じように、戻り値の一部を破棄する構文を提供する必要がありますstd::ignore


6
今では手遅れですが、使いづらく、将来的に置き換えられる可能性のある機能は、まったく使用できないよりはましであり、そういうものではないようです。std::ignore構造化されたバインディングには他に合理的な解釈がないため、標準委員会がタイムマシンを希望するようになるもの。
ダニエルH

11

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

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


25
これは未使用の変数警告を生成します-Wunused-variable、あなたは使うことができます:[[maybe_unused]] auto [ a, b, dummy ] = std::tuple(1,"2",3f);しかしそれはそれらのどれかが未使用であるかもしれないことを意味します、あなたはどれがどれかわからないでしょう。現在、その場合の良い解決策はありません。うまくいけば、c ++ 20で改善されるでしょう。ここから取得:stackoverflow.com/questions/41404001/…–
セリン

3
「現時点では、その場合の適切な解決策はありません」:それは完全には真実ではありません:他の変数に影響を与えることなく、未使用の変数の警告取り除くために使用でき(void)dummy;ます。
andreee

16
@andreee:警告を静めるためだけにステートメントを使い切ることは、私が「良い解決策」と呼ぶものではありません。
ニコルボーラス

「警告を静めるためだけにステートメントを使い果たす...」ステートメントが不足していませんか?
AndyJost

2
@AndyJost:いいえ。ただし、画面上の視覚的なスペースが不足しています。警告を静めるためにそれ、特に貴重な垂直スペースを使うことは役に立ちません。
ニコルボーラス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.