Ваша мысль относительно первой строки правильная, именно это и происходит.
Не существует никакого оператора +
по умолчанию для литеральных строк, таких как "ab"
, поэтому происходит то, что компилятор принимает это (какстрока в стиле C) и использует указатель const char*
, который указывает на литерал.Затем он принимает ваш буквальный символ 'c'
и переводит его в int
с некоторым значением.Затем этот int добавляется к адресу литерала и используется как C-строка.Поскольку вы превысили пространство, выделенное для вашей литеральной строки, результаты не определены, и он просто распечатывает символы с полученного адреса, пока не найдет ноль.
Если вы хотите создать строку за один выстрел,вы можете помочь компилятору выяснить, что вы хотите сначала преобразовать в string
с помощью приведения: std::string str = std::string("ab") + 'c';
.С другой стороны (как видно из отдельного комментария) сделайте это с конкатенацией, которая может или не может работать лучше.Используйте то, что кажется более понятным в вашем случае: std::string str = "ab"; str += 'c';
.
Во втором случае вы уже создали string
, а string
имеет перегруженный operator+
, который выполняет интуитивное объединение.