返回一个右值——这段代码有什么问题?
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
在栈上创建一个本地
std::string
变量m
然后返回这个字符串,但是它的内容被移到临时文件中,而不是复制。此时,函数
test
结束调用变量m
的析构函数(其内容被移到temp中)临时对象现在被绑定到右值引用
m
。据我所知,临时对象将一直保持活动状态,直到它的绑定对象处于活动状态并在作用域中。
右值引用仍然是引用,您的代码不正确的原因与下面所示的函数相同
std::string& test()
{
std::string m="Hello";
return m;
}
在这两种情况下,函数都返回对局部变量的引用。std::move
除了将m
转换为string&&
之外没有做任何事情,因此没有创建main
中的m
然后绑定到的临时创建。当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();
}
现在main
中的m
可以绑定到test
的返回值,并且它的生存期延长到与m
相匹配。
相关文章:
- 在黑客地球上没有获得以下C ++代码问题的输出
- VS 代码C++问题
- 插入操作的二叉搜索树代码问题
- 如何在代码问题中解决此问题 代码强制
- 发送和十六进制消息时套接字代码C++问题
- 代码问题将字符串转换为图表执行
- C 代码问题?编译器问题?代码块
- 代码问题.使用矢量删除相同的数字,除了它的最后一个入口
- 迭代列表以查找元素的出现.代码问题
- 使用JNI从Java调用本机(C++)函数时发生访问冲突:这是我的代码问题,还是已知问题
- XCode 4.5简单的OpenGL C 代码问题
- 在VS 2010上使用boost::interprocess生成代码问题
- 简单代码问题-未定义标识符
- 基本的c++代码问题
- 识别C++代码问题
- C++角色战斗代码问题
- OpenScenegraph 示例代码问题
- PortAudio示例代码问题
- 关于cout和cin的c++简单代码问题
- 关于歧义排列的代码问题