структурированные привязки и на основе диапазона; подавить неиспользованное предупреждение в gcc

Я хочу пройти карту, используя привязки структуры, игнорируя ключ:

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);

8

Решение

Соответствующие прагмы 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,

4

Другие решения

Кажется, ты прав, что 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;
}
9

По вопросам рекламы [email protected]