Benim anlayış,rationale C++ örtülü kopyalayıp kurucuyu taşıyor mu? C++ örtük kopya kurucu hakkında
T(T const& x) :
base1(x), base2(x) ... ,
var1(x.var1), var2(x.var2)...
{}
Taşı yapıcı benzer & hareket atama da benzer bir yol izler kopyalayın.
Neden aşağıdakine benzer tanımlanmamış? Örnek
T(T const& x) :
base1(static_cast<base1 const&>(x)),
base2(static_cast<base2 const&>(x)) ... ,
var1(x.var1), var2(x.var2)...
{}
üstü kapalı kopyalama/taşıma yapıcı/atama operatörü bir sınıfı, aynı zamanda bazı dönüştürme kurucular vardı. İşi bazı uygulama sınıflarına devrediyordum. work1
kopyalama/taşıma kurucular common_work
için kopyalama/taşıma kurucu çağırmak ve work
başka bir tür dönüştürür [olmayan bir kod ile gösterilmiştir] diğer kurucular ile kullanılmıştır kurucu yönlendirme gibi
class common_work //common implementation of many work like classes { common_work(common_work const&) = default; common_work(common_work&&) = default;// ... implicit constructors work for me. //a forwarding constructor which can take many work like objects template<class T, enable_if<work_like<T> > > common_work(T&& x) { ... } }; class work1 //one of the implementation { work1(work1 const&) = default; work1(work1&&) = default; ... common_work impl_; };
Bu
iyiydi.EBO ve diğer nedenlerden dolayı common_work
numaralı telefondan work1
numaralı ürünü devralmayı düşündüm. Yani yeni work1
sınıf
class work1 : private common_work
{
work1(work1 const&) = default;
work1(work1&&) = default; ...
};
benziyordu Ama, work1
common_work
için kopyalama/taşıma yapıcı tabanına türetilmiş bir static_cast
gerektirdiğinden aniden yönlendirme yapıcısı, daha iyi bir eşleşme başlamıştı, bir work_like
sınıftır.
NOT:
- yapıcı yönlendirme hiçbiri gerektirir metninin inşaat kopya yapıcı olarak yönlendirme yapıcısı, bir const eklenmesini gerektirir tetikler Scott Meyers tarafından verilen örnekte benzer bir tür yoktur. Ama bence sorun, yanlış sınıf tasarımından dolayı ortaya çıkıyor, buradaki sorun ise örtük kopya/hareket sırasında temel sınıfa geçen argümanın tam olarak eşleşmesi değil.
- Evrensel bir yönlendirme yapıcısı/atama yazamıyorum ve örtük olanları siliyorum çünkü silinen işlevler de aşırı yüklenme çözünürlüğüne katılır ve tam olarak eşleştiğinde hataya neden olur.
- Şu anda sahip olduğum çözüm, bir CRTP olarak
common_work
, yani şablon argümanı olarak türetilen türetilmiş sınıf yapmak ve iletici ileticiyienable_if<and_<work_like<T>,not_<is_same<T,Derived> > > >
olarak filtrelemek. Aksi halde, manuel olarak,work1
vestatic_cast
için kopyalama/taşıma yapıcı/ödev yazmaları, buggy, hata eğilimli ve bakım tehlikesi olan temel sınıfları temel olarak yazmam gerekir.
Belki de bu sorunu, "common_work" den türetilen T'leri reddetmek için SFINAE kısıtlamasını güçlendirerek geçici bir çözüm olabilir. –
Şu an yaptığım şey bu. NOT bölümünde 3. noktaya bakın. Yine de, '0s' değil,' is_same, Türetilmiş> ' –
abir
Tamam, özür dileriz. Son notu okumadım :) –