Чтобы объяснить, в чем проблема на самом деле ...
Хотя компилятор с радостью организует преобразование char *
/ C-строки в std::string
через соответствующий конструктор std::string
, это не то, что вы просили.
Вы запросили указатель на существующий std::string
объект. По определению, то, что передается вашей функции, должно быть адресом уже существующего std::string
(или потомка) объекта.
Вы должны понимать указатели как отдельный тип - ваша функция принимает pointer-to-std::string
«объект». Хотя к std::string
можно получить доступ через указатель на std::string
, сам указатель является , а не a std::string
, и при этом он не может быть "преобразован" в std::string
, и при этом он не может быть обработан в качестве указателя на символ (или наоборот).
Самая простая альтернатива - это константная ссылка на std::string
(const std::string &
). в данном случае const, потому что вы ничего не делаете для изменения строки. Если бы это было так, это было бы другое дело, и вам пришлось бы тщательно продумать, намерены ли вы, чтобы вызывающий абонент увидел ваши изменения.
Делая это, вы говорите, что хотите получить объект std::string
(помните, ссылка на объект - это тот объект , см., В частности, C ++ FAQ 8.5 ), которая позволяет компилятору вызывать соответствующий конструктор для создания для вас std :: string, когда функция вызывается с char *
(постоянным или нет).
В то же время, если кто-то передает вам фактический std::string
, конструктор избегается, и вы получаете такую же эффективность, как если бы вы взяли pointer-to-std::string
. Беспроигрышный.
В качестве альтернативы, конечно, вы можете просто взять std::string
, но в этом случае вы всегда получите копию передаваемой строки, будь то C-строка или std::string
. Иногда это желательно, иногда нет. В вашем случае вы ничего не делаете, кроме как распечатываете строку, делая ненужные накладные расходы.