2013-07-30 16 views
14

olan bir değişkeni hareket ettirin Sayfada How to: Write a Move Constructor Microsoft, bir taşıma kurucusunun nasıl yazılacağı hakkında bir örnektir. Bu temelde formdadır:std :: T &&

MyClass::MyClass(MyClass&& lhs) 
{ 
    *this = std::move(lhs); 
} 

Denedim std::move gerçekten burada gereklidir, ama neden? Taşınan tek şeyin, T&&'a dönüştürülmesi olduğunu düşündüm. Ama lhs zaten MyClass&& türünde, değil mi?

+14

Named referanslar Sol taraf vardır. *Her zaman*. –

+3

Çok uzun, ama [bu iyi bir okuma] (http://thbecker.net/articles/rvalue_references/section_01.html) rvalue referansları hakkında her şeyi öğrenmek için. –

+0

R. Martino Fernandes: Teşekkürler! Bunu bir cevap olarak kabul ediyorum. – Petter

cevap

20

Adlandırılmış rvalue başvurular lvalues'dir. Adsız rvalue referansları r değerleridir.

foo&& r = foo(); foo f = std::move(r); Bu yanıt bir göz atın: Bu std :: hareket çağrı neden gerekli olduğunu anlamak önemlidir https://stackoverflow.com/a/5481588/1394283 Çok iyi açıklıyor.


Bu fonksiyonun bir göz atın:

void foo(X&& x) 
{ 
    X anotherX = x; 
    // ... 
} 

ilginç bir soru: foo gövdesinde çağrılan lar yapıcısı kopya X' hangi aşırı yük? Burada, x, bir rvalue referansı olarak bildirilen bir değişkendir. Bu nedenle, x'un kendisinin de bir rengin gibi bağlanmasını beklemek oldukça mantıklıdır, yani X(X&& rhs); çağrılmalıdır. Hareket sematics biz sadece taşınmış bir şey, yani, çünkü son derece kafa karıştırıcı ve hataya açık olacaktır

X anotherX = x; 
// x is still in scope! 

olduğu gibi bir adı olan bir şeye zımnen uygulanacak izin

, şey Sadece kazdık, sonraki kod satırlarında hala erişilebilir. Ama hareketin anlambilim noktasının tüm noktası, taşıdığımız şeyin ölmesi ve hareket ettikten hemen sonra ortadan kalkması anlamında onu sadece "farketmez" olduğu yerde uygulamaktı.

şeyler Sol taraf veya SağDeğerler olabilir rvalue referans olarak ilan edilmiştir: rvalue referansların tasarımcıları biraz daha zekice bir çözüm seçmiş yüzden

. Ayırt edici ölçüt: eğer bir ismi varsa, o zaman bir değerdir. Aksi halde, bu bir değerdir.

Kaynak: http://thbecker.net/articles/rvalue_references/section_05.html

+1

Adil olmak gerekirse, 'T & foo()' nın dönüş değerinin hiçbir değeri yoktur, ancak bir değerdir. – Yakk

+0

@Yakk Haklısınız. _The ** İsimsiz rvalue ** referanslar rvalues._ Burada sadece rvalues ​​hakkında konuşuyoruz. –

İlgili konular