Подтвердить что ты не робот

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

Функциональные языки с сопоставлением с образцом (иногда?) Имеют возможность игнорировать некоторые связанные значения, но в структурированных привязках С++ 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) разрешает атрибут, но он не работает со структурированными привязками. сообщение об ошибке

4b9b3361

Ответ 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]], я предполагаю, что рассуждение может быть одинаковым. Остановка предупреждений компилятора не является прецедентом.

Ответ 2

В качестве резолюции к CWG 2360 рабочий проект стандарта получил следующую формулировку ([dcl.attr.unused]):

  1. Атрибут может применяться к объявлению класса, typedef-имени, переменной (включая объявление структурированной привязки), нестатического члена данных, функции, перечисления или перечислителя.

  2. Для объекта, помеченного maybe_unused, реализации не должны maybe_unused предупреждение о том, что объект или его структурированные привязки (если таковые имеются) используются или не используются. Для объявления структурированной привязки, не помеченного maybe_unused, реализации не должны maybe_unused такое предупреждение, если все его структурированные привязки не используются.

Декларации структурированного связывания ранее явно не упоминались.