Per*_*-lk 10 c++ gcc unused-variables c++17 structured-bindings
我想使用结构绑定遍历地图,忽略键:
for (auto& [unused, val] : my_map)
do_something(val);
Run Code Online (Sandbox Code Playgroud)
我尝试过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]].
Run Code Online (Sandbox Code Playgroud)
似乎该[[maybe_unused]]
属性尚未实现结构绑定.
这有什么简单的解决方案吗?任何宏,gcc/gnu扩展名,或任何暂时禁止该特定警告的pragma对我来说都没有问题; 例如,在我使用基于范围的for的整个函数体中禁用它,因为我使用它的函数非常短(它基本上是两个不同映射的两个范围,具有精确的行为).
我用来编译项目的(相关)选项是:
-std=c++17 -Wall -Wextra -Werror -pedantic -pedantic-errors
Run Code Online (Sandbox Code Playgroud)
我目前要做的是,但这很难看:
for (auto& [unused, val] : my_map)
(void)unused, do_something(val);
Run Code Online (Sandbox Code Playgroud)
maybe_unused
对于gcc 7.2.0中的结构化绑定,似乎你没有实现该属性,但是值得注意的是,它似乎是针对gcc 8.0 trunk实现的(g ++ 8.0.0 20171026 experimental).
使用gcc 8.0 trunk编译,下面会发出-Wunused-variable
警告:
// warning: unused structured binding declaration [-Wunused-variable]
for (auto& [unused, val] : my_map) { }
Run Code Online (Sandbox Code Playgroud)
然而,这不会:
// no warning
for ([[maybe_unused]] auto& [unused, val] : my_map) { }
Run Code Online (Sandbox Code Playgroud)
特别是,删除[[maybe_unused]]
但使用至少一个有界变量也不会产生警告(意图?).
// no warning
for (auto& [unused, val] : my_map)
{
do_something(val);
}
// no warning
for (auto& [unused, val] : my_map)
{
(void)unused;
}
Run Code Online (Sandbox Code Playgroud)
本页记录了相关的 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);
}
Run Code Online (Sandbox Code Playgroud)
这是我可以拥有的禁用警告的最小范围,并且仍然可以使用 抑制警告-Wall -Wextra -Werror
。
归档时间: |
|
查看次数: |
1067 次 |
最近记录: |