2014-10-11 75 views
0

我有一個類,像這樣:堆/內存損壞恢復出廠功能右值引用時

class CObj 
{ 
public: 
    CObj(std::string const& str) : m_str(str) {} 

    static CObj&& Current() 
    { 
     CObj uxid{"test"}; 
     return std::move(uxid); 
    } 

private: 
    std::string m_str; 
}; 

我用它像這樣:

CObj obj{CObj::Current()}; 

obj內的std::string損壞/無效。我期望從工廠移動臨時工並移動初始化obj。我究竟做錯了什麼?

+3

返回對本地的引用與左值引用一樣不如左值引用。只需返回值'static CObj Current(){return {「test」}; }'讓編譯器爲你處理移動。 – Casey 2014-10-11 00:10:16

回答

3

返回類型Current是一個引用類型。您正在返回對本地對象的引用,在被調用者嘗試訪問它之前該對象將被銷燬,以構造obj,從而導致未定義的行爲。返回類型是右值引用的事實與此事實沒有關係,問題與左值引用返回類型相同。

如果你想從一個函數返回一個新創建的對象,你應該返回值是:

static CObj Current() { 
    return {"test"}; 
} 

或:

static CObj Current() { 
    CObj uxid{"test"}; 
    // do stuff with uxid here. 
    return uxid; 
} 

當地的返回值將被自動移動,儘管編譯器更可能應用返回值優化,並直接在返回值中構造對象,而無需任何移動或複製。