Переменные, локальные для функции, уничтожаются, когда функция выходит из области видимости. Возврат ссылки на такую переменную является неопределенным поведением (ссылка возвращается, когда функция возвращается).
Я хочу выделить еще одну проблему того же типа. Когда вы пишете:
const auto& name = char_convert(ssname); // Bad (undefined behaviour)
Вы связываете ссылку на значение. Временный std::string
, возвращаемый char_convert()
, будет уничтожен после этого оператора. Так что name
болтается даже до того, как возвращается функцией strmember()
. Вы, вероятно, должны написать вместо этого (скопировать инициализацию):
auto name = char_convert(ssname); // Better
Теперь, если вы не хотите нарушать совместимость, я думаю, вам нужно будет использовать прокси-класс (как предложено @ Fureei sh) для обработки преобразований под капотом. Здесь вы можете увидеть пример того, как написать прокси-класс (при необходимости).
РЕДАКТИРОВАТЬ:
Как отмечалось в комментариях @ Jarod42 , const auto& name = char_convert(ssame);
действительно правильно, потому что, когда временный объект связан со ссылкой, его время жизни будет продлено до самого времени жизни ссылки (до тех пор, пока name
не выйдет из область действия в нашем случае).
Но имейте в виду, что name
относится не к ssname
, а к временному, возвращаемому char_convert(ssname)
(так что это синтаксически правильно, но все равно не делает то, что вы хотел это сделать).
В любом случае неопределенное поведение все равно будет происходить после того, как функция вернется