Sınıfım için hareket semantiklerinin uygulanmasına biraz zaman harcıyorum ama şimdi onu kullanan işlevlerle uğraşıyorum.Anlambilim ve const başvuruları taşıyın
Tamam, öyleyse yığın için çok fazla veriye sahip olan bu nesneye sahibim: CLargeOb
için hareket semantiği uygulamam (constructor and operator =). o nesneler çöpe atılan/taşınmasını sağlamak için her zaman mümkün değildir Ancak
void OtherOb::Func(CLargeOb&& largeOb1, CLargeOb&& largeOb2)
{
SomeOtherFunc(largeOb1); // use objects
SomeOtherFunc(largeOb2);
m_largeOb1 = (CLargeOb&&)largeOb1; // save as members and trash the originals
m_largeOb2 = (CLargeOb&&)largeOb2;
}
, bu yüzden bu iki işlevi eklendi: Bu ideal böyle kullanılır o zaten can, çalışmasına rağmen
void OtherOb::Func(const CLargeOb& largeOb1, CLargeOb&& largeOb2)
{
SomeOtherFunc(largeOb1);
SomeOtherFunc(largeOb2);
m_largeOb1 = largeOb1;
m_largeOb2 = (CLargeOb&&)largeOb2;
}
void OtherOb::Func(CLargeOb&& largeOb1, const CLargeOb& largeOb2)
{
SomeOtherFunc(largeOb1);
SomeOtherFunc(largeOb2);
m_largeOb1 = (CLargeOb&&)largeOb1;
m_largeOb2 = largeOb2;
}
Bu nesnelerin 3 ya da daha fazlasını parametre olarak alan bir fonksiyona sahip olduğumda * ss'de büyük bir acıya dönüşeceğini tahmin ediyorum. Bunu şablonlar ya da 'mükemmel yönlendirme' kullanarak çözmenin akıllıca bir yolu yok mu?
@MooingDuck: VS2010'da sorunsuz çalışıyor, sorun değil. = (&&) operatörünü çağırmak için, bunu std :: move veya && cast kullanarak açıkça çağırmalısınız. Ancak çözüm, aşağıda daha iyi sağlandı. – demorge
@demorge: oh doğru, ismini değiştirdiğinde kuralların tamamen değiştiğini unutmuşum. –
için özür dilerim Lütfen '(CLargeOb &&) largeOb1' yerine' std :: move (largeOb1) 'yazınız. Gelecek programcı nesilleri, non-idiomatic ve borderline okunamayan C/C++ mix yerine bir harekete izin veren standart C++ 11 yöntemini kullandığınız için size teşekkür edecektir. – fredoverflow