То, что вы пытаетесь сделать, имеет неопределенное поведение .
string s;
по умолчанию инициализируется (размер равен нулю), затем вы получаете доступ к элементам, которых там нет.
Чтобы решить эту проблему, вы можете просто использовать string s = "ab";
или
std::string s;
s.push_back('b');
s.push_back('a');
или как предложено @ bindsniper001 (хотя вы не можете добавить к длине строки таким образом):
std::string s2(2, ' ');
s2[0] = 'c';
s2[1] = 'd';
Жить на Годболт