C++ return一个std::string&
C++ return a std::string &
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"
的 return。所以第二个版本也是不安全的。我对吗?
不,这两个程序都不安全。在这两种情况下,returned 引用都是悬空的,使用该引用的行为将是未定义的。
第二个程序也是病式的,因为它试图将左值引用(即 returned)绑定到右值(临时)。第二个程序可能被认为“不太安全”,因为编译器可能会选择不编译它。
修复函数:当目的是return一个新对象时,不要试图return一个引用。 Return 一个对象。
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"
的 return。所以第二个版本也是不安全的。我对吗?
不,这两个程序都不安全。在这两种情况下,returned 引用都是悬空的,使用该引用的行为将是未定义的。
第二个程序也是病式的,因为它试图将左值引用(即 returned)绑定到右值(临时)。第二个程序可能被认为“不太安全”,因为编译器可能会选择不编译它。
修复函数:当目的是return一个新对象时,不要试图return一个引用。 Return 一个对象。