Why are the first two calls to doSomething OK by the compiler, but using two elements in the list causes an ambiguous call?
#include
What is happening here is that in the two element initializer list both of the string literals can be implicitly converted to const char* since their type is const char[N]. Now std::vector has a constructor that takes two iterators which the pointers qualify for. Because of that the initializer_list constructor of the std::vector is conflicting with the iterator range constructor of std::vector.
If we change the code to instead be
doSomething({"hello"s, "stack"s});
Then the elements of the initializer list are now std::strings so there is no ambiguity.