Проблема в том, что ваши строки не являются строками.
Вы должны помнить, что строковые литералы (вида "foo"
не имеют типа std::string
, но const char*
(на самом деле они имеют тип const char[N]
, но для наших целей мы можем считать их указателями ).
Итак, когда вы пишете такой код:
std::string foo = "bar" + 42
тогда типы включаются следующим образом:
std::string = const char* + int
Другими словами, ваш код добавляет целое число к указателю, а затем результирующий указатель char сохраняется в виде строки.
Обратите внимание, что добавление целого числа к указателю является простой арифметикой указателя, поэтому компилятор не будет жаловаться.
Если мы сделаем это вместо:
std::string foo = std::string("bar") + 42
Затем мы создаем правильную строку, а затем пытаемся добавить 42 к этому. Это не определено, поэтому мы получим ошибку компилятора (что, по крайней мере, лучше, чем молча делать неправильные вещи).
Правильным решением является использование потока, как показано в одном из других ответов:
std::ostringstream os("file");
os << x;
std::string s = os.str();