12

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, work1common_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 ileticiyi enable_if<and_<work_like<T>,not_<is_same<T,Derived> > > > olarak filtrelemek. Aksi halde, manuel olarak, work1 ve static_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.
+0

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. –

+0

Ş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

+0

Tamam, özür dileriz. Son notu okumadım :) –

cevap

1

Bu sorun, MSVC++ bugstracker sayfasında birkaç yıl önce tartışıldı (bu nedenle, henüz düzeltilmemişse, MSVC++'da bilinen bir sorundur). Standart taban veya üye direkt başlatıldı karşılık gelen baz veya x üyesi ile bir ...

  • söylüyor.Ben hata raporu okurken

Ben testi çeşitli derleyiciler yaptık ve hepsi "sihirli dökme". Standart çok detaylarda (değer kategorisi ve c/v niteleyicileri ile ilgili) sessiz görünüyor ve sadece “x'in karşılık gelen üssü ile” yazıyor. "x değil, x ile karşılık gelen ... x yerine" yerine tam nesneyi (ben sadece bu şekilde anlamlandırabileceğini söyleyeyim).

+0

Açıkça varsayılan özel üye işlevlerinin henüz MSVC'de uygulanmadığını unutmayın (2013 RTM'de yakında alacaklarını söylediler). –

İlgili konular