从移动返回的右值引用未持久化
Return rvalue reference from move is not persisted
我有这个代码:
string&& getString() {
string s {"test"};
return move(s);
}
我试着输出:
cout << getString() << endl;
它给了我空的输出。
当我使用:
string getString() {
string s {"test"};
return move(s);
}
它有效。
我的问题:
为什么第一个不起作用?我移动了引用,所以本地对象不应该被销毁?
第二个是否"复制"(不考虑RVO)?
为什么第一个不起作用?我移动了引用,所以本地对象不应该被销毁?
string&& getString() {
string s {"test"}; // s is a local variable
return move(s); // move doesn't really move object, it turns the object to rvalue
}
您正在返回对本地non-static
对象的右值引用
右值引用是一个引用,在引用本地对象时返回它意味着返回对不再存在的对象的引用。是否使用std::move()并不重要,因为std::move
并没有真正移动对象,它会将对象变成右值
第二个是否"复制"(不考虑RVO)?
编译器应该首先考虑RVO,然后考虑move
(由于C++11),否则应该复制。也可以看到这个。
你只需要写:
string getString() {
string s {"test"};
return s;
}
相关文章:
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- C++取消引用指针.为什么会发生变化
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 强制转换为引用类型
- 引用一个已擦除类型(void*)的指针
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 具有默认值的引用获取函数
- 如何使用基类指针引用派生类成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 从移动返回的右值引用未持久化