结构化绑定和基于范围的;在gcc

时间:2017-10-29 20:42:55

标签: c++ gcc c++17 unused-variables structured-bindings

我想使用结构绑定遍历地图,忽略键:

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扩展名,或任何暂时禁止该特定警告的pragma对我来说都没有问题;例如,在我使用基于范围的for的整个函数体中禁用它,因为我使用它的函数非常短(它基本上是两个不同映射的两个范围,具有精确的行为)。

我用来编译项目的(相关)选项是:

-std=c++17 -Wall -Wextra -Werror -pedantic -pedantic-errors

我目前要做的是,但这很难看:

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

2 个答案:

答案 0 :(得分:9)

对于gcc 7.2.0中的结构化绑定,似乎你没有实现maybe_unused属性,但是值得注意的是它似乎是为gcc 8.0 trunk实现的(g ++) 8.0.0 20171026实验)。

使用gcc 8.0 trunk进行编译,以下内容将发出-Wunused-variable警告:

// 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]]但使用至少一个有界变量也不会产生警告(打算?)。

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

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

答案 1 :(得分: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抑制警告。