2012-05-25 16 views
6

Hareketli bir dönüşüm işlecinin sözdizimi nedir? Bir dönüşüm işlecinin semantik dizisini taşıma

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

nasıl data_ öğrenebilirim

kopyalanabilir veya taşınabilir olmalıdır:

Bir obj dönüşüm operatörü vardır etrafında obj sarar bir sarmalayıcı var?

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

ikinci versiyonu olarak adlandırılan olamaz zaman ilk sürümü çağrılır (yani: wrap örneği dönüştürülen geçici olmadığı veya yoktur

+1

Yine de "data_" öğesini bir "std :: string" içine nasıl taşıyabilirsiniz? Eğer data_ 'std :: string' ise, bu soru çok daha anlamlı olur. – ildjarn

+1

@ildjarn, özellikle char * veya std :: string hakkında değil, dönüşüm operatörünün taşıt anlamsallığını anlatmaktır. –

+0

Tamam, bu daha mantıklı. İlk örneğiniz olarak mümkün olan en kötü veri türünü seçtiniz. ; -] – ildjarn

cevap

8

bunun için sözdizimi böyle bir şey olurdu std::move'un açık kullanımı.

Visual Studio'nun r değeri referanslarının bu yönünü uygulamadığını unutmayın.

+0

'const &' genellikle kopyalama işlemleri 'const' olduğu için bile istenebilir. –

+0

@Luc: İyi nokta. Sabit. –

+0

Sanırım, “user obj const” ve “const”, dönüş değeri bir alt nesne ise daha mantıklı. Kopyalamaya gerek yok. Benzer şekilde, “operator obj &&() &&”, O (1) olması beklense bile, bir hareket inşaatını ortadan kaldırır. – Potatoswatter