Я не могу найти действительно убедительный конкретный набор стандартных формулировок, не воспроизведя половину стандарта (: D), но я считаю, что это четко определено.
Конструктор array
требует, чтобы T
было MoveConstructible или MoveAssignable , и вы не сможете создать экземпляр std::array<void, N>
.
Но это нормально, потому что std::tuple_size
этого делать не нужно, и не обязательно, чтобы это делалось, и ни одно из них не предъявляет никаких других особых требований, которые могут сделать ваш код проблематичным.
Однако это не похоже на полезный код, и не существует общего правила, когда void
можно использовать в качестве аргумента шаблона. Вы должны посмотреть на требования к конкретной вещи, которую вы используете, в том контексте, в котором вы ее используете.