Строка будет глубокое копирование, они не используют один и тот же буфер.
При этом при возврате их из функции большинство хороших компиляторов могут использовать либо оптимизацию возвращаемого значения, либо копирование, чтобы маневр не был таким уж дорогим (или даже бесплатным).
Если вы используете c ++ 11, то семантика перемещения определяется стандартом, так что для такой вещи, как возвращаемая строка, будьте уверены, что худший случай (даже без оптимизаций) будет довольно дешевым.
РЕДАКТИРОВАТЬ: резюмируя, вы гарантируете, что строка, которой вы «владеете», будет иметь уникальный кусок памяти, который будет сохраняться как минимум в течение времени жизни локальной строки. Однако более чем вероятно, что компилятор не скопирует его из строки в функции, а просто поменяет местами его указатели или даже полностью исключит копию (то есть строка в функции будет фактически строкой, которую вы также назначите).