Jam*_*nco 2 c++ rvalue-reference move-semantics c++11
我遇到了以下代码段
std::string&& test()
{
std::string m="Hello";
return (std::move(m));
}
int main()
{
std::string&& m = test();
}
Run Code Online (Sandbox Code Playgroud)
我理解上面的代码不正确且不安全,但我不确定原因.到目前为止,这是我对代码的理解.在功能test
在堆栈上创建一个std::string调用的局部变量m.
然后返回此字符串,但不是复制,而是将其内容移动到临时字符串.此时函数test结束调用变量的析构函数m(其内容被移动到temp)
临时值现在绑定到右值引用m.根据我的理解,一个临时的将保持活着,直到它的绑定对象存在并且在范围内.
有人可以告诉我哪里可能出错了吗?为什么上面的代码不安全?
右值引用仍然是引用,您的代码不正确的原因与下面显示的函数相同
std::string& test()
{
std::string m="Hello";
return m;
}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,该函数都返回对局部变量的引用.std::move不会做的比其他投什么m来string&&,所以没有临时创建m的main,然后结合.当test退出时,本地变量被破坏,并且m是悬空参考.
要修复代码,请将返回类型更改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();
}
Run Code Online (Sandbox Code Playgroud)
现在min main可以绑定到返回值test,并且它的生命周期被扩展为匹配的值m.
| 归档时间: |
|
| 查看次数: |
181 次 |
| 最近记录: |