2010-09-06 19 views
7

Bir işlevden Foo türünde bir araya getirilemez nesne döndürmek istiyorum. Bu temel olarak, arayanın eylemleri tamamladıktan sonra bir temizleme gerçekleştirmek için bir eylemci kümesi gerçekleştirmek için kullanacağı yardımcı bir nesnedir. rvalue references gelişiyle önce Sadece bir hareket yapıcı sağlamak için kötü bir form mu?

, ben benzer bir shared_ptr<Foo> falan döndü. Rvalue referansları ile, kurucu ve kopya kurucuyu özel yapmak ve tek kamu kurucusunun bir hareket yapıcısı olması için başka bir seçenek olacaktır. Foo böyle bir şey görünecektir:

class Foo : boost::noncopyable 
{ 
private: 
    Foo(/* whatever the real ctor needs */); 

public: 
    Foo(Foo && src); 

    // ... interesting stuff ... 
}; 

Foo a(SomethingThatReturnsFoo()); // allowed 
Foo b;  // error, no public default constructor 
Foo c(a); // error, noncopyable 
Foo d = a; // error, noncopyable 

sorum bunu yapmak için kötü olacak mı kaynaklandığı, yoksa makul görünüyor olmadığını. Bunun neden sorunlara yol açacağını ya da okumayı zorlaştıracağını düşünemiyorum, ancak referanslar söz konusu olduğunda hala yeni bir insansım, bu yüzden düşünmediğim şeyler olabilir.

+0

Minör sözler: siz de Operator' bir 'Constructor' Taşı, insanlar muhtemelen beklemek bir' Taşı Ataması sağlarsanız. Bunu sağlamayı mı planlıyorsunuz yoksa değişmez bir sınıf mı istiyorsunuz? –

+0

Bu özel durumda, immutable olması amaçlanmıştır, bu yüzden atamayı istemiyorum, ama genel olarak iyi bir nokta. – Charlie

+0

btw, derleyici tarafından oluşturulan kopyalama/taşıma işlemleri departmanındaki son değişikliklerle, aslında artık desteksiz olarak türetmek zorunda değilsiniz. Bir hareket edicinin bildirilmesi, derleyicinin başka herhangi bir kopyalama/taşıma işlemi oluşturmasını engelleyecektir, bkz. Http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3203.htm – sellibitze

cevap

9

Bu, hiç de kötü bir form değil, muteks gibi nesneleri veya unique_ptr gibi kapsamlı nesneleri göz önünde bulundurun. Unique_ptr hareketlidir, ancak kopyalanamaz ve STL'nin bir parçasıdır.

+0

Bunu ekleyelim * çok iyi bir form *. İçtenlikle düşünülmüş nesnelerin kural değil, * istisna * olması gerektiğini düşünüyorum. Daha fazla C++ 0x kullanıyorum, bu düşüncede daha çok eminim. –