From [temp.variadic] (working draft) it seemed to me that a parameters pack can be expanded while defining an arguments list of another template class or function.
Consider the following class:
template<typename... T>
struct S {
template<T... I>
void m() {}
};
int main() {
S<int, char> s;
// ...
}
The intent is to capture the types used to specialize the template class S
and use them to define an arguments list of non-type parameters for the member method m
(T
is limited to a few types, of course, but this isn't the argument of the question).
Is this legal code? Can I use a parameter pack the way I used it or am I misinterpreting the standard (pretty sure that's the case indeed)?
In order to add more details to the question, here are some results from a few experiments with the major compilers:
s.m<0, 'c'>()
: clang v3.9 compiles it, GCC v6.2 and GCC v7 return an error.s.m<0>();
: clang v3.9 compiles it, GCC v6.2 returns an error and GCC v7 stops the compilation with an ICE.s.m<>();
: clang v3.9, GCC v6.2 and GCC v7 compile it with no errors.
At least, compilers seem to be as confused as me.