Почему std :: make_tuple (7 + N …) допустим в C ++ 11?

Следующий код допустим в C ++ 11.

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

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

21

Решение

Прежде всего, посмотрите на параметры шаблона: 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. Расширение пакета состоит из шаблона и многоточия, создание которых приводит к нулю или большему количеству экземпляров шаблона в списке […].

25

Другие решения