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