Код string& foo() { return "Hello World"; } не скомпилируется. Строковый литерал "Hello World" — это const char*, и ты не можешь привязать неконстантную ссылку к временному значению. Компилятор выдаст ошибку: could not convert "Hello World" to std::string&.
const string& foo1() { return "Hello World"; }
Это компилируется, но вызывает ошибку во время выполнения. Хотя const-ссылки могут привязываться к временным объектам, временный объект string уничтожается сразу после возврата из функции. Возвращённая ссылка становится висячей — она указывает на невалидную память, что приводит к неопределённому поведению и потенциальным ошибкам сегментации.
char* foo1() { return "Hello World"; }
Это компилируется без предупреждений, но чревато проблемами. Строковые литералы хранятся в статической памяти только для чтения. Возврат char* на строковый литерал выглядит рабочим, но попытка его изменить вызывает неопределённое поведение:
char* ptr = "Hello World";
ptr[0] = 'J'; // неопределённое поведение — изменение статической памяти
Компилятор помещает строковые литералы в статическое хранилище, которое не должно изменяться. Попытка это сделать может уронить программу или повредить память.
Используй один из этих подходов:
std::string по значению: string foo() { return "Hello World"; }const std::string& от статического объектаstd::string_view для невладеющих ссылок на строки (C++17+)Главный вывод: никогда не возвращай неконстантные ссылки на временные объекты или строковые литералы. Предпочитай возврат по значению или используй подходящие строковые типы с нужной тебе областью видимости.
Код string& foo() { return "Hello World"; } не компилируется, потому что non-const ссылка не может привязаться к временному объекту std::string, созданному из строкового литерала.
Новый — ещё не проверен сообществом
Вы