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

 

posted on 2019-11-28 15:46  newbird2017  阅读(182)  评论(0编辑  收藏  举报