右值与移动语义

假如想象 提交于 2019-12-05 23:33:39

一、Overloading Rules for Rvalue and Lvalue References

左值引用和右值引用的优先级问题

1、如果只实现了左值引用,那么不能传入右值和const。 void f(X& x);

2、如果只实现了void f(const X& x); 可以接收左值和右值。

3、如果同时实现了void f([const] X& x) 和 void f(X &&x),右值会优先选择移动语义。

总结:如果你的类只提供了拷贝语义,没有提供移动,那么std::move()就调用拷贝操作。

 

二、没必要 而且不应该为返回值调用std::move操作。

X f(){
    X x;
    ...
    return x;
}

编译器的行为如下:

优先级最高的是

1、如果X有自定义的移动或者拷贝构造,编译器会选择抹掉拷贝或移动构造。具名返回值优化。

    如果编译器没有消除构造,那么

2、如果X有移动构造,就会调用移动构造。

3、如果X有拷贝构造,调用拷贝构造。

4、调用缺省的?内存拷贝?

 

3、返回local object的引用是错误的。

X&& foo () {
    X x;
    ...
    return x; // ERROR: returns reference to nonexisting object
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!