Your compiler is interpreting the standard correctly. Yes, this is a tricky corner case that many interviewers ask so they appear smarter than they really are.
The route const char[2] (the formal type of the literal "1") to const char* to bool is a standard conversion sequence, since it uses exclusively built-in types.
Your compiler must favour that to a user-defined conversion sequence, viz. the std::string constructor from a const char*.
The presence of the overload void foo(long long int a) is a red herring.
You can rather elegantly work around this in C++11 by dropping your overload to bool, and writing
#include
template <
typename Y,
typename T = std::enable_if_t{}>
>
void foo(Y)
{
std::cout << "bool" << std::endl;
}
in its place. The compiler will then favour the std::string for const char[N] over the template (as that is one of the requirements of overload resolution). Nice!