右值和移动
C++ Rvalue and move
本文关键字:移动 更新时间:2023-10-16
请帮助理解以下内容
class Demo {};
Demo && fun() {
Demo d;
cout << "Addres of d in fun " << &d << endl;
return move(d);
}
int main()
{
Demo && d = fun()
}
这是返回对象的正确方式吗??
返回对局部变量的引用是未定义的行为,所以不,这段代码不正确。
返回一个对象的正确方法是返回一个右值:
Demo fu(n) {
Demo d;
return d; // "move(d)" is implied
}
Demo && d = fun(); // OK, reference binds to temporary and extends its lifetime
通常,按值返回对象可以提供最简单的代码和最佳性能:
Demo fun() {
Demo d;
return d;
}
int main() {
Demo d = fun();
}
如果Demo是复制成本高、移动成本低的类型,例如std::vector
,则move语义将自动启动以避免复制——不需要&&
。
相关文章:
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- C / C++ 移位/偏移/向左或向右移动位图?
- MSVC将仅移动结构参数解释为指针
- 自定义先决条件对移动分配运算符有效吗
- 返回值优化:显式移动还是隐式
- 当有分配器意识的容器被复制/移动时,反弹分配器是否被复制/移走
- 为什么复制而不是移动数据元素?
- 可以使用移动语义更改或改进此C++代码吗?
- 使lambda不可复制/不可移动
- c++在使用指针时移动语义
- 将QGraphicsItem的移动区域限制在多边形区域内
- SendInput()鼠标移动计算
- 按值 C++ 返回时进行双倍移动
- 移动二维数组中的字符
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- 安全到标准:移动会员?
- OpenVR:向视图方向移动