我想使用结构绑定遍历地图,忽略键:
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);
答案 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
抑制警告。