11

BenC++ neden varsayılan olarak rönükle referanslar oluşturmuyor?

void doWork(Widget && param) // param is an LVALUE of RRef type 
{ 
    Widget store = std::move(param); 
} 

Neden std::move() ile rvalue geri param döküm gerekiyor aşağıdaki işlevi var ki? param türünün, işlev imzasında rvalue başvurusu olarak bildirildiğinden dolayı rengin olduğu açık değil mi? Hareket yapıcısı, bu prensipte tek başına otomatik olarak çağrılmasın mı?

Neden bu varsayılan olarak gerçekleşmiyor?

void doWork(Widget && param) 
{ 
    Widget store1 = param;  // automatically move param 
    Widget store2 = param;  // boom 

    Widget store_last = param; // boom  
} 

akım tasarımı ile: senin tasarımı ile

cevap

22

burada Yani ahlaki

void doWork(Widget && param) 
{ 
    Widget store1 = param;    // ok, copy 
    Widget store2 = param;    // ok, copy 

    Widget store_last = std::move(param); // ok, param is moved at its last use 
} 

Bir rvalue referansına sahip olsa bile size kullanabileceğiniz anlamına gelir bunun için bir isme sahip olması Birden çok kez. Daha sonra kullanmak için ihtiyaç duyabileceğiniz için otomatik olarak taşıyamazsınız.

+0

Oh, anlıyorum. Mantıklı! Katılıyorum, kopya tasarımı her zaman gizli bir hamle olmaktan daha güvenli! – barney

+0

@barney basit bir örnek, "Oh, anlıyorum. Anladım!" Bir tane sağlayabilirdim sevindim. – bolov

+0

Kimlik, gerçekten bunu yapan bazı gerçek kodları bulmak için gerçekten mücadele ediyor ve dahası, bir derleyici bir hata olarak algılayamadı ve davranamadı. Göreceli ticaret indirimiyle ilgili teklif için herhangi bir tartışma var mıydı, yoksa meydana gelmesi çok daha muhtemel bir durum mu var? –