Я хочу пройти карту, используя привязки структуры, игнорируя ключ:
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 или любая прагма для временного подавления этого конкретного предупреждения мне подходят; например, отключив его во всем теле функции, где я использую диапазон на основе диапазона, потому что функция, которую я использую, довольно короткая (это в основном два цикла диапазона для двух разных карт с точным поведением ).
(Соответствующие) параметры, которые я использую для компиляции проекта:
-std=c++17 -Wall -Wextra -Werror -pedantic -pedantic-errors
То, что у меня есть ток, но это ужасно
for (auto& [unused, val] : my_map)
(void)unused, do_something(val);
Соответствующие прагмы 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
,
Кажется, ты прав, что 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;
}