2012-12-10 18 views
6

boost::unordered_map'da bir değer türü olması gereken belirli bir tür için hareket yapıcılarını (kopya yapıcısı yok) uygulamak istiyorum. Bu tür Composite diyelim.Yapıcıyı ve başlatma listesini taşıma

struct Base 
{ 
    Base(..stuff, no default ctor) : initialization list {} 
    Base(Base&& other) : initialization list {} 
} 

struct Composite 
{ 
    Base member; 
    Composite(..stuff, no default ctor) : member(...) {} 
    Composite(Composite&& other) : member(other.member) {} // <---- I want to make sure this invokes the move ctor of Base 
} 

Bu yüzden boost::unordered_map< Key , Composite > kopya kurucu gerektirmez yazmak istiyorum ve sadece hareket yapıcısı kullanır:

Composite aşağıdaki imzası vardır. Mümkünse, Composite hareket yapıcısının başlatıcı listesinde Base kopya kurucusunu kullanmak istemiyorum.

Bu mümkün mü?

cevap

11

member(std::move(other.member)). Eğer rvalue referans olarak bir şey almak zaman altın bir kural olarak

, sen std::move içine kullanmak gerekir ve evrensel referans ( && ile yani sonucuna şablonu türü) tarafından bir şey almak zaman, sen std::forward içinde kullanmak gerekir. Nispeten yeni bir terim * evrensel referansı * için

+1

+1. – mavam

+1

@MatthiasVallentin: Bu terim Scott Meyers tarafından yerinde yapıldı. Standartlar komitesi, günümüzde "yönlendirme referansı" terimini tercih ediyor. –

+0

Neredeyse iki yıldır, topluluğun istikrarlı bir dönem boyunca birleştiğini görmekten memnuniyet duyuyoruz. – mavam

İlgili konular