右值与移动语义

一、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
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章