Подтвердить что ты не робот

Почему std:: make_tuple (7 + N...) закончен в С++ 11?

Следующий код является законным в С++ 11.

template<int... N>
std::tuple<decltype(N)...> f()
{
    return std::make_tuple(7 + N...); 
}

Что это значит?

4b9b3361

Ответ 1

Прежде всего, посмотрите параметры шаблона: template <int ... N>. Даже если переменное число аргументов шаблона может быть присвоено f, все они должны иметь тип int.

Теперь, когда вы используете f<t1, t2, ..., tn>, распаковка параметра (7 + N...) будет следовать шаблону 7 + N и развернуть до

7 + t1, 7 + t2, 7 + t3, ..., 7 + tn

Поэтому вы получаете кортеж, который содержит каждый из ваших аргументов шаблона, увеличивающийся на семь. Подробности можно найти в разделе 14.5.3 Шаблоны Variadic [temp.variadic].

3. Расширение пакета состоит из шаблона и эллипсиса, экземпляр которого производит ноль или более экземпляров шаблона в списке [...].