2017-10-29 18 views
1

内を抑圧未使用の警告:構造化バインディングと範囲ベースのため。私は、キーを無視して、構造のバインディングを使用してマップをトラバースしたいgccの

for (auto& [unused, val] : my_map) 
    do_something(val); 

私はGCC-7.2.0と異なるオプションを試してみました:

// The warning is issued 
for ([[maybe_unused]] auto& [unused, val] : my_map) 
     do_something(val); 

// Syntax error 
for (auto& [[[maybe_unused]] unused, val] : my_map) 
     do_something(val); 

// The same two combinations above with [[gnu::unused]]. 

それはと思われます構造体バインディングの場合、[[maybe_unused]]属性はまだ実装されていません。

これには簡単な解決策はありますか?マクロ、gcc/gnu拡張子、または特定の警告を一時的に抑制する任意のプラグマは私にとっては問題ありません。私はこれを使用している関数がかなり短いので(これは基本的に正確な振る舞いを持つ2つの異なるマップに対して2つのrange-for-loopsであるため)、range-based-forを使用している関数本体全体で無効にします)。私はプロジェクトをコンパイルするために使用してい

(関連する)オプションは次のとおりです。

​​

私は上に行くために現在持っているが、それは醜い何:

for (auto& [unused, val] : my_map) 
    (void)unused, do_something(val); 
+0

関連:[構造化バインディングでのstd :: ignore](https://stackoverflow.com/questions/40673080/stdignore-with-structured-bindings) – dfri

+0

@dfriしかし、 'std :: ignore'は既に宣言されている変数なので使用できません。私が持っているのは宣言なので、新しい名前を導入しています。 –

+1

はい私は、リンクに説明されているように、関連するリンクだけを投稿しました(標準では後で紹介するかもしれませんが、構造化されたバインディングのための 'std :: ignore'は現在のところありません)。リンクされたスレッドの回答の1つにコメントすると、警告抑制(バインディング内のすべての宣言をカバーする)に 'maybe_unused'を使用することが推奨されていますが、サポートされているかどうかはわかりません。範囲ベースのループ内の構造化バインディングのコンテキスト。 – dfri

答えて

4

関連GCCプラグマ文書番号on this pageが記載されています。

#include <map> 

std::map<int, int> my_map; 

void do_something(int); 

void loop() 
{ 
#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wunused-variable" 
    for (auto & [unused, val]: my_map) 
#pragma GCC diagnostic pop 
     do_something(val); 

} 

は、これは私が持っている可能性が無効になっ警告の最小範囲であり、さらに警告が-Wall -Wextra -Werrorで抑制されています。

3

maybe_unused属性はgcc 7.2.0の構造化バインディングにはまだ実装されていませんがgcc 8.0 trunk(g ++ 8.0.0 20171026 experimental)用に実装されているようです。

// warning: unused structured binding declaration [-Wunused-variable] 
for (auto& [unused, val] : my_map) { } 

これはしません一方:

// no warning 
for ([[maybe_unused]] auto& [unused, val] : my_map) { } 

奇妙に、[[maybe_unused]]の除去が、のうちの少なくとも一つを利用して、GCC 8.0トランクを使用してコンパイル

、以下が-Wunused-variable警告を発します有界変数も警告を出さない(意図しているか?)。 (プラグマのソリューションに加えて)一方

// no warning 
for (auto& [unused, val] : my_map) 
{ 
    do_something(val); 
} 

// no warning 
for (auto& [unused, val] : my_map) 
{ 
    (void)unused; 
} 

、あなたの現在の(void)unused修正に代わるものとして、あなたはstd::ignoreunusedを割り当てることができます:

for (auto& [unused, val] : my_map) 
{ 
    std::ignore = unused; 
    do_something(val); 
} 

割り当ては効果がありませんが、警告を抑止してください。

+1

ありがとうございます。 gcc-8 '[[maybe_unused]]'が必ずしも必要ではないことを知りたい人は、興味があります。 –

関連する問題