As an addendum to this question, what is going on here:
#include using namespace std; struct A { string s; }; int main() { A a = {0}
As people have pointed out, this "works" because string has a constructor that can take 0 as a parameter. If we say:
#include using namespace std; struct A { map m; }; int main() { A a = {0}; }
then we get a compilation error, as the map class does not have such a constructor.