Putting aside the looping instantiation, you cannot achieve what you want as a function parameter cannot be used as a constant expression, which is required of template arguments. Meaning the following is not allowed either:
template <typename... A>
constexpr auto make_slit(A const... args)
{
return slit<args...>();
}
// error
make_slit('a');
If you find this surprising, keep in mind that constexpr functions are a feature to allow some functions to also be usable in a constant expression. Yours isn’t in general however:
char c;
std::cin >> c;
// what is the result type?
make_slit(c);
I should note however that during the design of literal string operators it was suggested that a function template form be allowed (much like they are for integer and floating-point literals), which would achieve exactly what you need:
// allowed...
template<char... Cs>
constexpr slit<Cs...> operator"" _slit()
{ return {}; }
// ...but only for
auto constexpr s = 123_slit;
auto constexpr t = 12.3_slit;
// ... and not
auto constexpr u = "abc"_slit;
This missing functionality was brought up most recently in 2013 with Richard Smith’s n3599: Literal operator templates for strings. Unfortunately I don’t know what the current status of the feature is.