14

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

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 扩展或任何临时禁止该特定警告的编译指示对我来说都可以;例如,在我使用 range-based-for 的整个函数体中禁用它,因为我使用的函数非常短(它基本上是两个具有精确行为的不同映射上的 range-for-loop )。

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

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

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

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

2 回答 2

11

看来您是对的,该maybe_unused属性尚未针对 gcc 7.2.0 中的结构化绑定实现,但值得注意的是,它似乎已针对 gcc 8.0 主干(g++ 8.0.0 20171026 实验性)实现。

使用 gcc 8.0 主干编译,以下将发出-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;
}
于 2017-10-29T21:24:10.333 回答
4

相关的 GCC 编译指示记录在此页面上

#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.

于 2017-10-29T21:13:44.130 回答