Технически, потому что типы для кортежа должны быть ссылочными. Семантически, потому что void не является типом полного статуса.
void
больше похоже на тип. Вы не можете ссылаться на него, sizeof
на самом деле не является законным, и для использования в качестве типа для кортежа это должно быть. Который будет крутить всякие странные вопросы. Так что должно быть sizeof (void)? tuple<int,void>
и tuple<int>
одинаковы или нет?
Таким образом, идиоматическое решение состоит в том, чтобы использовать фактический тип, назначенный для задания std::ignore
, который буквально создан для этого:
Объект неопределенного типа, так что ему может быть присвоено любое значение без эффекта. Предназначен для использования с std::tie
при распаковке std::tuple
, в качестве заполнителя для аргументов, которые не используются.
Он также определен в tuple
, поэтому не создавайте свою собственную структуру, доверьтесь стандартной библиотеке.