Прелюдия:
std::tuple<int, int, int> f();
std::tuple<int, int, float, int> g();
C ++ 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();
Можно ли будет сделать что-то подобное, используя новый синтаксис структурированных привязок? Как это будет работать?
c++
language-lawyer
c++17
Jotik
источник
источник
std::ignore
, я думаю. Поскольку мы гарантируем исключение копирования, фиктивная переменная инициализируется; сstd::tie
, то временное, которое находится справа от присвоения,std::ignore
инициализируется.auto[IGNORE]
который генерирует уникальное имя (например, со специфичным для компилятора COUNTER или LINE ). Он был бы достаточно читабельным и на практике работал бы какstd::ignore
дляstd::tie
.get
возвращается.Ответы:
Предложение структурированных привязок содержит специальный раздел, отвечающий на ваш вопрос ( P0144R2 ):
Однако обратите внимание, что рабочий проект стандарта в настоящее время пересматривается соответствующими национальными органами (NB), и есть комментарий NB, запрашивающий эту функцию ( P0488R0 , US100):
источник
std::ignore
в структурированных привязках нет другой разумной интерпретации .Нет. Вам просто нужно придумать имя переменной, которое не будет упоминаться позже.
источник
-Wunused-variable
, вы можете использовать:[[maybe_unused]] auto [ a, b, dummy ] = std::tuple(1,"2",3f);
но это означает, что любой из них может быть неиспользованным, вы не узнаете, какой из них. для этого случая сейчас нет хорошего решения. Надеюсь, это будет улучшено в C ++ 20. взято отсюда: stackoverflow.com/questions/41404001/…(void)dummy;
чтобы избавиться от предупреждения о неиспользуемой переменной, не затрагивая другие переменные.