Структурированное связывание с [[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) разрешает атрибут, но он не работает со структурированными привязками. сообщение об ошибке
1 ответ
В структуре переплета бумаги:
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]]
Я предполагаю, что рассуждения могут быть такими же. Остановка предупреждений компилятора не является вариантом использования.
В качестве резолюции к CWG 2360 рабочий проект стандарта получил следующую формулировку ( [dcl.attr.unused]):
Атрибут может применяться к объявлению класса, typedef-имени, переменной (включая объявление структурированной привязки), нестатического члена данных, функции, перечисления или перечислителя.
Для лица, отмеченного
maybe_unused
Реализации не должны выдавать предупреждение о том, что объект или его структурированные привязки (если таковые имеются) используются или не используются. Для объявления структурированной привязки не помеченоmaybe_unused
Реализации не должны выдавать такое предупреждение, если все его структурированные привязки не используются.
Декларации структурированного связывания ранее явно не упоминались.