C ++返回std :: string&

时间:2018-10-29 10:52:42

标签: c++ c++11 gcc reference dangling-pointer

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 :(得分:11)

否,这两个程序都不安全。在这两种情况下,返回的参考都是悬空的,使用参考的行为将是不确定的。

第二个程序也是格式错误的,因为它试图将左值引用(返回的)绑定到右值(临时)。第二个程序可能被认为“不太安全”,因为编译器可能选择不编译它。

要修复此功能:当目的是返回新对象时,请勿尝试返回引用。而是返回一个值。