2012-05-25 8 views
6

可動変換演算子の構文は何ですか?変換演算子のセマンティクスを移動

私はobj変換演算子があるの周りobjをラップラッパー、持っている:

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

私はdata_をコピーまたは移動する必要があるかどうかを調べることができますどのように?

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

番目のバージョンが呼び出されることができないときに最初のバージョンが呼び出されます(すなわち:wrapインスタンスが変換され、一時的ではないではないか、まったくあり

+1

どうすれば 'data_'を' std :: string'に移動できますか? 'data_'が' std :: string'でもあった場合、この質問はもっと意味があります。 – ildjarn

+1

@ildjarn質問は、変換演算子に関する移動セマンティクスに関するものであり、特にchar *やstd :: stringに関するものではありません。 –

+0

それはもっと理にかなっています。最初の例として最悪の可能性のあるデータ型を選択したばかりです。 ; - ] – ildjarn

答えて

8

そのための構文は、このようなものになるだろうstd::moveの明示的な使用)。

Visual Studioでは、r値参照のこの側面は実装されていません。

+0

'const&'は通常はコピー操作が 'const'なので望ましいかもしれません。 –

+0

@Luc:良い点。一定。 –

+0

戻り値がサブオブジェクトの場合、 'operator obj const&()const&'はもっと意味があると思います。コピーする必要はありません。同様に、 'operator obj &&()&&'はO(1)であると予想されていても移動構築を取り除きます。 – Potatoswatter