右值與移動語義

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

 

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