Std:: ignore со структурированными привязками?

Прелюдия:

std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();

С++ 1z представит синтаксис для структурированных привязок, который позволит писать вместо

int a, b, c;
std::tie(a, b, c) = f();

что-то вроде

auto [a, b, c] = f();

Однако std::tie также разрешено указывать std::ignore для игнорирования некоторых компонентов, например:

std::tie(a, b, std::ignore, c) = g();

Можно ли сделать что-то подобное, используя новый синтаксис структурированных привязок? Как это работает?

Ответ 1

Предложение структурированных привязок содержит выделенный раздел, отвечая на ваш вопрос (P0144R2):

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

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

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

tuple<T1,T2,T3> f();

auto [x, std::ignore, z] = f(); // NOT proposed: ignore second element

Однако это неудобно.

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

Однако обратите внимание, что рабочий проект стандарта в настоящее время пересматривается соответствующими национальными органами (NB), и есть комментарий NB, запрашивающий эту функцию (P0488R0, US100):

Объявления разложения должны содержать синтаксис для отказа от некоторых возвращаемых значений, так же как std::tie использует std::ignore.

Ответ 2

Можно ли сделать что-то подобное, используя новый синтаксис структурированных привязок?

Нет. Вам просто нужно составить имя переменной, которое не будет упоминаться позже.