структурированное связывание с [[Maybe_unused]]

Функциональные языки с сопоставлением с образцом (иногда?) Имеют возможность игнорировать некоторые связанные значения, но в структурированных привязках C ++ 17, похоже, нет способа сделать это (std :: ignore со структурированными привязками?). Рекомендуется использовать фиктивное имя, но тогда мы получим предупреждения о неиспользуемых переменных.

С последними головами clang и gcc, это делает ожидаемую вещь, которая хороша и полезна,

[[maybe_unused]] auto x =4 ; // fine, no warning
[[maybe_unused]] auto [a,dummyb,dummyc] = std::tuple<int,int,float>(1,1,1.0f);

но я бы также надеялся, что это сработает:

auto [g,[[maybe_unused]]dummyh,[[maybe_unused]]dymmyi] =
std::tuple<int,int,float>(1,1,1.0f);

есть ли конкретная причина атрибуты не может быть использован здесь? (как в стандарте, так и технически). Ни gcc, ни clang не принимают это.


Редактировать, собирая статус поддержки: (спасибо Godbolt / Проводник компилятора). Это работает как ожидалось в (может быть и раньше):

  • ствол gcc 8.0 (g ++ 8.0.0 20171015 экспериментальный)
  • лязг 4.0.0
  • ICC 18 (не проверено, в соответствии с функции)

MSVC 17.3.5 (и графический интерфейс Visual Studio), позволяет атрибут, но он не работает со структурированными привязками. сообщение об ошибке

25

Решение

В структуре переплета бумаги:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0144r2.pdf

они обсуждают свои рассуждения:

3.8 Должен ли быть способ явно игнорировать компоненты?

Мотивация — заставить замолчать предупреждения компилятора о неиспользуемых именах.

Мы думаем, что ответ должен быть «еще нет». Это не мотивировано использованием
случаи (глушение предупреждений компилятора является мотивацией, но это не
случай использования как таковой), и лучше всего оставить его, пока мы не сможем вернуться к нему в
контекст более общего предложения сопоставления с образцом, где это должно
выпадают как частный случай.

Симметрия с std :: tie предполагает использование
что-то вроде std :: ignore:

   tuple<T1,T2,T3> f();
auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element

Тем не менее, это чувствует себя неловко.

Предвидение сопоставления с образцом в языке
может предложить подстановочный знак, такой как _ или *, но так как у нас еще нет
сопоставление с образцом преждевременно выбирать синтаксис, который, как мы знаем, будет
совместимы. Это чистое расширение, которое может ждать рассмотрения
с сопоставлением с образцом.

Хотя это явно не касается [[maybe_unused]]Я предполагаю, что рассуждения могут быть такими же. Остановка предупреждений компилятора не является вариантом использования.

16

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

Других решений пока нет …

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