The function TryListConversion didn't properly validate the following part of the standard:
Otherwise, if the parameter type is a character array [... ] and the initializer list has a single element that is an appropriately-typed string literal (8.5.2 [dcl.init.string]), the implicit conversion sequence is the identity conversion.
This caused the following call to f() to be ambiguous.
void f(int(&&)[1]); void f(unsigned(&&)[1]); void g(unsigned i) { f({i}); }
This issue only occurrs when the initializer list had one element.
Consider moving this up to around line 144 (just after the definition of ::IsStringInit).