2016-12-30 10 views
18

パターンマッチング(時には?)を持つ機能言語ではバインドされた値を無視する可能性がありますが、C++の構造化バインディングではこれを行う方法がないようです(std::ignore with structured bindings?)。アドバイスはダミーの名前を使用することですが、未使用の変数についての警告が表示されます。打ち鳴らすとgccの両方の最新のヘッドを[[maybe_unused]]と構造化バインド

、これは私も期待しているだろう素晴らしいと便利です予想されること、

[[maybe_unused]] auto x =4 ; // fine, no warning 
[[maybe_unused]] auto [a,dummyb,dummyc] = std::tuple<int,int,float>(1,1,1.0f); 

が、これはうまくいくん:

auto [g,[[maybe_unused]]dummyh,[[maybe_unused]]dymmyi] = 
     std::tuple<int,int,float>(1,1,1.0f); 

具体的な理由はありますかattributesここでは使用できませんか? (標準的にも技術的にも)。 gccもclangもこれを受け入れません。


編集、サポート状況の収集:(ありがとうgodbolt/compiler explorer)。それはで期待どおりに動作します(以前にも可能性があり):(specsに従ってテストされていない、)

  • のgcc 8.0トランク(G ++ 8.0.0 20171015実験)
  • 打ち鳴らす4.0.0
  • ICC 18

MSVC 17.3.5(およびVisual Studio GUI)のでは、属性はですが、構造化バインドでは機能しません。構造バインディングの論文でbug report

+2

潜在的にネストされた分解をブロックすることが懸念されていたと思います。 –

+0

Hmm。私はそれについてもっと考えると、その単一の属性を外側に置くことでもう少しうまくいく:-) –

+0

問題はあなたです外に出ればどんな変数が使われていなかったのか知りません – serine

答えて

8

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0144r2.pdf

彼らは彼らの推論を話し合う:

3.8は、明示的にコンポーネントを無視する方法があるはず?

動機づけは、未使用の名前についてコンパイラの警告を消すことです。

私たちは、答えはあるべきだと思う「まだ。」これは、(コンパイラの警告をサイレンシング動機ですが、それはそれ自体 ユースケースではありません)を使用することにより 例をやる気されていない、と私たちはできるようになるまで、最高の残っていますこれを という文脈で再訪してください。具体的には が該当するより一般的なパターンマッチングの提案文脈です。 std ::ネクタイ

対称性がSTDのような なものを使用することをお勧めし::無視:

tuple<T1,T2,T3> f(); 
    auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element 

はしかし、これは厄介な感じ。言語 に一致

見越しパターンは_様またはワイルドカード(*)を示唆することもできますが、我々はまだ我々が 互換性があります知っている構文を選択するのは時期尚早であるマッチング パターンを持っていないので。これはパターン一致で とみなされるのを待つことができる純粋な拡張です。

これは明らかに[[maybe_unused]]を指定していませんが、推論は同じである可能性があります。コンパイラの警告を止めることは、ユースケースではありません。

関連する問題