Ну, то, что я обычно делал бы в C ++, это
имя строки = строка ("ab") + 'c';
Помните, что литерал "ab" является , а не типа string. Вы надеялись, что между массивами символов и символами не работает знак «+», а затем надеялись, что компилятор каким-то образом заметит, что вы действительно хотите, чтобы результат был std :: string, и затем проанализировал свое выражение на правая часть для некоторой комбинации неявных преобразований, которые могут объединяться с оператором (ами) для получения результата этого типа. Для меня это довольно высокий заказ.
Независимо от того, это не имеет значения. Видите ли, в Си единственная разница между массивом и указателем заключается в том, как распределяется их память. Если у вас есть один, у вас по сути есть «массив / указатель». Таким образом, «+» - это оператор, определенный во всех массивах и указателях, который принимает другой аргумент любого целочисленного типа и выполняет математическую обработку указателей, возвращая указатель на то множество элементов, прошедших через эту точку. Кроме того, в C "char" на самом деле просто еще один тип целочисленного типа. Эти решения по дизайну C были полезны взломы , но, как часто случается с взломами, они сочетаются с интуитивно неожиданными результатами. Таким образом, все, что «ab» + «c» делает для вас, - это возвращать адрес на 99 байт раньше, где бы ни находился литерал «ab» в памяти.
Иногда вы можете положиться на неявные преобразования, но вы действительно должны быть готовы помочь вашему компилятору немного в другое время.