右值和移动

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语义将自动启动以避免复制——不需要&&