Ответ 1
В стандарте ничего не говорится о том, что tuple
или array
должно быть пустым, то, что вы видите, - это детали реализации, но нет причин сделать tuple<>
непустым, тогда как есть хороший причина для array<T, 0>
непуста, рассмотрим:
std::array<int, sizeof...(values)> = { { values... } };
Когда пакет параметров пуст, вы получите:
std::array<int, 0> = { { } };
Для того чтобы инициализатор был действителен, объекту нужен член, который не может быть int[0]
, потому что вы не можете иметь массивы нулевого размера в качестве членов, поэтому возможная реализация - int[1]
В реализации нет специального случая для всего массива, он может просто сделать:
T m_data[N == 0 ? 1 : N];
и все остальные члены работают точно так же (предполагая, что end()
определяется как begin()+N
)