返回一个右值——这段代码有什么问题?
Returning an rvalue - what is wrong with this code?
我发现了以下代码片段
std::string&& test()
{
std::string m="Hello";
return (std::move(m));
}
int main()
{
std::string&& m = test();
}
我知道上面的代码不正确且不安全,但我不确定为什么。
到目前为止,这是我对代码的理解。在函数 test
在堆栈上创建了一个名为 m
的局部 std::string
变量。
然后返回此字符串,但它的内容被移动到临时文件中,而不是制作副本。此时函数 test
结束调用变量 m
的析构函数(其内容已移至临时)
临时文件现在绑定到右值引用 m
。据我了解,临时对象将保持活动状态,直到其绑定对象处于活动状态并在范围内。
有人可以告诉我我可能哪里出错了吗?为什么上面的代码不安全?
右值引用仍然是引用,您的代码不正确的原因与下面显示的函数相同
std::string& test()
{
std::string m="Hello";
return m;
}
在这两种情况下,函数 return 都是对局部变量的引用。 std::move
除了将 m
强制转换为 string&&
之外什么都不做,因此没有临时创建 main
中的 m
然后绑定到。当test
退出时,局部变量被销毁,m
是悬空引用。
要修复您的代码,请将 return 类型从 string&&
更改为 string
。
std::string test()
{
std::string m="Hello";
return m; // std::move is redundant, string will be moved automatically
}
int main()
{
std::string&& m = test();
}
现在 main
中的 m
可以绑定到 test
的 return 值,并且 lifetime of that is extended 可以与 [=13= 的值匹配].
我发现了以下代码片段
std::string&& test()
{
std::string m="Hello";
return (std::move(m));
}
int main()
{
std::string&& m = test();
}
我知道上面的代码不正确且不安全,但我不确定为什么。
到目前为止,这是我对代码的理解。在函数 test
在堆栈上创建了一个名为
m
的局部std::string
变量。然后返回此字符串,但它的内容被移动到临时文件中,而不是制作副本。此时函数
test
结束调用变量m
的析构函数(其内容已移至临时)临时文件现在绑定到右值引用
m
。据我了解,临时对象将保持活动状态,直到其绑定对象处于活动状态并在范围内。
有人可以告诉我我可能哪里出错了吗?为什么上面的代码不安全?
右值引用仍然是引用,您的代码不正确的原因与下面显示的函数相同
std::string& test()
{
std::string m="Hello";
return m;
}
在这两种情况下,函数 return 都是对局部变量的引用。 std::move
除了将 m
强制转换为 string&&
之外什么都不做,因此没有临时创建 main
中的 m
然后绑定到。当test
退出时,局部变量被销毁,m
是悬空引用。
要修复您的代码,请将 return 类型从 string&&
更改为 string
。
std::string test()
{
std::string m="Hello";
return m; // std::move is redundant, string will be moved automatically
}
int main()
{
std::string&& m = test();
}
现在 main
中的 m
可以绑定到 test
的 return 值,并且 lifetime of that is extended 可以与 [=13= 的值匹配].