Why is std::make_tuple(7 + N...) legal in C++11?
c++, c++11, compile-time-constant, templates, variadic-templates
Solution
First of all, look at the template parameters: `template <int ... N>`. Even though a variable number of template arguments can be given to `f`, all of them must be of type `int`.
Now when you use `f<t1, t2, ..., tn>`, the parameter unpacking `(7 + N...)` will follow the pattern `7 + N` and expand to
7 + t1, 7 + t2, 7 + t3, ..., 7 + tn
Therefore you end up with a tuple which contains each of your template arguments increased by seven. The details can be found in section 14.5.3 Variadic templates [temp.variadic].
3. A pack expansion consists of a pattern and an ellipsis, the instantiation of which produces zero or more instantiations of the pattern in a list [...].
Problem
The following code is legal in C++11. ``` template<int... N> std::tuple<decltype(N)...> f() { return std::make_tuple(7 + N...); } ``` What does it mean?