Возвращает ли строковый литеральный адрес из безопасной и переносимой функции?

Мне нужна функция для возврата строки, доступ к которой будет доступна только для чтения. Содержимое строки известно во время компиляции, так что я все равно буду использовать строковый литерал.

Я могу вернуть что-то вроде std::string:

std::string myFunction()
{
   return "string";
}

или return const char*:

const char* myFunction()
{
   return "string";
}

Является ли второй альтернативный безопасным и переносимым в этом сценарии?

Ответы

Ответ 1

Является ли второй альтернативный безопасным и переносимым в этом сценарии?

Да! Распределение строк в строковых литералах static, и они сохраняются для срока службы приложения.

Ответ 2

Да! Но остерегайтесь этой потенциальной возможности:

char * myFunc() {
    return "Constant string?";
}

Да, вы можете преобразовать строковый литерал в неконстантный char *! Это позволит вам позже нарушить мир, пытаясь изменить содержимое этого char *. Эта "функция" существует по устаревшим причинам - строковые литералы старше const и первоначально были определены как char * в C.

К счастью,

g++ выдает неприятное предупреждение, даже в режиме по умолчанию. Я не знаю, как VС++ выдает предупреждение так же охотно.

Ответ 3

Да. (Нельзя хранить такой указатель в глобальной структуре данных).