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