I want to make a string literal that I can use as a template argument. It throws the compiler into some infinite loop. What is the problem and fix?
template <char...> struct slit { }; template <typename ...A> constexpr auto make_slit(char const* const s, A const ...args) { return *s ? make_slit(s + 1, *s, args...) : slit<args...>(); } int main() { auto const tmp_(make_slit("slit")); return 0; }
Mandatory error (with clang++ -std=c++1y ):
t.cpp:4:16: fatal error: recursive template instantiation exceeded maximum depth of 256 constexpr auto make_slit(char const* const s, A const ...args) ^ t.cpp:6:15: note: in instantiation of function template specialization 'make_slit<char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char, char>' requested here return *s ? make_slit(s + 1, *s, args...) : slit<args...>();