C ++ возвращает std :: string & - PullRequest
       28

C ++ возвращает std :: string &

0 голосов
/ 29 октября 2018
std::string &func(int vlu)
{
    std::string str;
    str = std::to_string(vlu) + "something";

    return str;
}

вышеуказанная функция явно небезопасна.
Ниже приводится другая версия.

std::string &func(int vlu)
{
    return std::to_string(vlu) + "something";
}  

У меня есть несколько вопросов:
Компилятор (GCC), во второй версии, не дает мне никакого предупреждения. Это безопасно? Я просто думаю, что компилятор (или что-то?) Создаст временную переменную для хранения выражения std::to_string(vlu) + "something". Так что вторая версия тоже небезопасна. и я прав?

1 Ответ

0 голосов
/ 29 октября 2018

Нет, ни одна из программ не является безопасной. В обоих случаях возвращаемая ссылка свисает, и поведение использования ссылки будет неопределенным.

Вторая программа также плохо сформирована, потому что она пытается привязать ссылку lvalue (которая возвращается) к rvalue (временному). Вторая программа может считаться «менее опасной», так как компилятор может не компилировать ее.

Чтобы исправить функцию: не пытайтесь вернуть ссылку, если целью является возвращение нового объекта. Вместо этого верните значение.

...