目前我正在学习C ++和第六版C ++ Primer Plus,由Steven Prata和p。 389我发现smth非常有趣,我想为自己澄清一下。 如果我们有这样的功能:
const std::string &ft_add_on_sides(std::string s1, std::string s2)
{
std::string res;
res = s2 + s1 + s2;
return (s2);
}
int main(void)
{
std::string input = "Hello"
std::string result = ft_add_on_sides(input, "###");
return (0);
}
据我所知,这个函数期待两个字符串对象,它们将是那些程序员实际传递的副本。并且此函数将返回const引用到某个内存地址
但我对回复声明感兴趣:
由于 s1 或 s2 位于临时存储空间中,我们可以访问它们,但什么时候会被销毁?我不会因为这样的退货声明而陷入困境吗?
加。因为变量可以被销毁,我仍然要求它的地址。
答案 0 :(得分:2)
在调用函数继续之前,return
语句执行后,函数的参数将被销毁。这意味着您仍然可以在return
值表达式中使用这些参数,但最好还是返回副本。
您在示例中所写的内容是“未定义的行为”。任何事情都可能发生。通常,在调试模式下,编译器在捕获对已销毁字符串的访问方面相当不错,但在发布版本中,编译器不再引入代码来捕获错误。
答案 1 :(得分:-1)
您可以在此处阅读接受的答案。
the return value is copied out of a local variable into the return register if necessary.
功能'不再需要堆栈帧,局部变量会弹出,一旦函数返回就无法访问,但s2
将被复制到返回寄存器中。