Я думаю, что это небольшая слабость C ++. Есть неудачное сочетание двух факторов:
- Функция верна только в том случае, если ее аргумент равен.
- Неявное преобразование означает, что аргументом функции является , а не объектом, которым она может казаться.
Я не сочувствую людям, которые не задумываются о времени жизни объектов, на которые у них есть указатели / ссылки. Но неявное преобразование, которое, безусловно, является языковой особенностью с тонкими плюсами и минусами, не делает анализ здесь очень простым. Иногда неявное преобразование является плохой новостью, поэтому существует ключевое слово explicit
. Но проблема не в том, что преобразование в string
в целом плохо, просто плохо для этой функции, используемой таким неправильным способом.
Автор функции может фактически отключить неявное преобразование, определив перегрузку:
const char *fun(const char *s) { return s; }
Одно только это изменение означает, что код, который ранее был плохим, работает. Поэтому я думаю, что в этом случае это хорошая идея. Конечно, это не поможет, если кто-то определит тип, о котором автор fun
никогда не слышал, и который имеет operator std::string()
. Кроме того, fun
не является реалистичной функцией, и для более полезных подпрограмм вы, возможно, не захотите предоставлять эквивалент, который работает на char*
. В этом случае void fun(const char *);
по крайней мере заставляет вызывающую функцию явно приводить к строке, что может помочь им правильно использовать функцию.
В качестве альтернативы, вызывающий абонент может заметить, что он предоставляет char*
и возвращает ссылку на string
. Мне кажется, это бесплатный обед, так что должны прозвенеть тревожные колокольчики, откуда взялась эта строка и как долго она продлится.