Как происходит удержание?
Все просто.
Вызов
std::array a{42,45,77}
match
array(T, U...)
с T = decltype(42)
и U... = decltype(45), decltype(77)
, то есть T = int
и U... = int, int
.
Таким образом, тип a{42,45,47}
становится array<T, 1 + sizeof...(U)>
, поэтому std::array<int, 1 + sizeof...(int, int)>
, поэтому std::array<int, 1 + 2>
, то есть std::array<int, 3>
Другими словами: извлекаются типы аргументов;первый (T
) используется для определения типа массива (первый параметр шаблона);остальные используются только для подсчета (sizeof...(U)
).Но для второго параметра шаблона важно также сосчитать первый аргумент (типа T
, поэтому 1
в 1 + sizeof...(U)
).