9
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"。所以第二个版本也是不安全的。我对吗?

4

1 回答 1

12

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

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

修复函数:当目的是返回一个新对象时,不要试图返回一个引用。而是返回一个对象。

于 2018-10-29T10:59:53.913 回答