【发布时间】:2021-05-12 00:34:11
【问题描述】:
如果我尝试从函数返回字符串文字,我可以制作以下两个版本:
std::string get_val()
{
return "1234";
}
const std::string & get_ref()
{
return "1234";
}
但是,让我感到困惑的是,我认为您需要一个长寿命的对象才能拥有一个左值引用(我将 const std::string & 读作左值引用,也许我弄错了)。
为什么会这样?从函数返回后"1234" 住在哪里?
【问题讨论】:
-
我认为它不起作用,事实上 GCC 会对该代码发出警告,如果您尝试调用 get_ref() 它会崩溃 jdoodle.com/iembed/v0/90U
-
get_ref()的第二版无效。它似乎可以工作,但返回对本地对象的引用仍然无效。 -
您使用的是什么编译器和警告级别(或缺少警告级别),在哪些情况下未诊断?
-
哦,废话,那是有道理的。问题是
std::string & get_ref()是编译器错误,但添加const通过了构建,我没有注意到警告。我正在将 gcc 与 -Wextra 一起使用,但我只是感到困惑并过早发布到这里。对不起大家! -
它可能会“工作”,直到有东西覆盖了
std::string的尸体,它正在分解临时字符串曾经所在的位置。似乎在工作是未定义行为的最狡猾的形式。