Чтобы исправить первый код, вы можете написать:
template<class ... Values>
constexpr Object(Values ... values)
: values{values...}
{
static_assert(sizeof...(values) == 8);
}
По поводу вашего дополнительного вопроса:
template<int ... ints>
struct Object2
{
const int values[sizeof...(ints)]{ints...};
};
Object2<1,21,3> o2; // array with 3 elements
std::cout << o2.values[1] << std::endl; // 21
Размер массива должен быть известен во время компиляции.Таким образом, вы не можете указать длину массива при вызове конструктора, это слишком поздно.Но вы можете использовать нетиповые параметры при создании экземпляра шаблона.
Demo