2012-05-25 78 views
6

可移動轉換運算符的語法是什麼?移動轉換運算符的語義

我有一個包裝,環繞obj,其中有一個obj轉換操作符:

class wrap { 
public: 
    operator obj() { ... } 
private: 
    obj data_; 
}; 

我如何才能知道是否data_應該被複制或移動?

+1

無論如何,你怎樣才能將'data_'移動到'std :: string'中?如果'data_'也是'std :: string',這個問題會更有意義。 – ildjarn

+1

@ildjarn問題是關於在轉換運算符上移動語義,而不是關於char *或std :: string。 –

+0

好的,這樣做更有意義。作爲第一個例子,您恰好選擇了最糟糕的數據類型。 ; - ] – ildjarn

回答

8

該語法將是這樣的:

class wrap { 
public: 
    operator obj() const & { ... } //Copy from me. 
    operator obj() && { ... } //Move from me. 
private: 
    obj data_; 
}; 

第一個版本將被調用時,第二個版本不能稱之爲(即:要轉換的wrap實例不是暫時的,或者沒有明確使用std::move)。

請注意,Visual Studio沒有實現r值引用的這個方面。

+0

'const'甚至可能是需要的,因爲通常複製操作是'const'。 –

+0

@Luc:好點。固定。 –

+0

我認爲'operator obj const&()const&'更合理,如果返回值是一個子對象。沒有必要複製。同樣,'operator obj &&()&&'會消除移動構造,即使它預期爲O(1)。 – Potatoswatter