2013-02-09 16 views
8

Aşağıdaki gibi bir nesneyim var ve ben std::vector<Mesh> için bir ek olabilir, böylece bir hareket yapıcı uygulamak için çalışıyorum.Oluşturucu Taşıyın, std :: move kullanarak vektörü iki nesne arasında taşıyın.

struct Mesh 
{  
    std::vector<Vector3> vPoint; 
    bool Valid; 

    Mesh(Mesh&& other) 
    { 
     vPoint = std::move(other.vPoint); 
     Valid = std::move(other.Valid); 
    } 
}; 

Bu doğru yol mu? Ve eğer öyleyse eğer std :: move üzerinde diğer .Valid değeri nedir?

Düzenleme: Ayrıca

ben bu nesnenin bir örneğini varsa aşağıdaki senaryoda std :: hareket kullanmak gerekir?

std::vector<Mesh> DoSomething() 
{ 
    Mesh mesh; //Imagine vPoint is filled here to 

    std::vector<Mesh> meshes; 
    meshes.push_back(std::move(mesh)); // Here is my question, std::move? or just pass mesh here? 

    return meshes; 
} 
+1

Neden bir "bool" taşıyalım? – us2012

+0

@ us2012 Sadece std :: move 'veya diğer tümleşik türlerle ne olduğunu merak ediyorum. Değer 'this.Valid' değerine kopyalanır ve sonra 'other.Valid 'varsayılan bool değerine ayarlanır (aka false)? – NtscCobalt

cevap

9

aşağıdaki gibi hamlen yapıcısı yazmalısınız:

Mesh(Mesh&& other) 
: vPoint(std::move(other.vPoint)) 
, Valid(std::move(other.Valid)) 
{} 

yapıcı başlatıcısı listesini kullanarak aksine yapıcı bünyesinde atamanın dezavantaj olduğunu eski durumda Mesh nesnenin üyesi nesneler o Taşınıyorsunuz, varsayılan olarak inşa edilmiş ve daha sonra bedene atanmış durumdasınız. İkinci durumda, doğrudan std::move aramasının sonucundan yapılandırılmıştır.

Bir nesneyi, taşıdıktan sonra tümleşik türde veya daha karmaşık bir nesne olarak okumamalısınız. Bu tür nesneler belirtilmemiş bir halde bulunur.

+0

Ok teşekkürler, ancak Taşı Atama operatörü içinde ne var? 'VPoint = std :: move (other.vPoint)' uygun mu? – NtscCobalt

+0

@NtscCobalt Evet, – Praetorian

+0

Alright teşekkürler. – NtscCobalt

3

(kısmi cevap - movebool ing hakkında biraz yanıtlayan)

cppreference.com yaklaşık std::move aşağıdakileri söylemektedir:

kütüphane kodu içinde geçerli bir değer bırakmak için gereklidir argüman, fakat tür veya işlev aksi belirtilmedikçe, sonuç argümanında diğer kısıtlama yoktur. Bu, 'un, bir argümandan tekrar kullanılmasını önlemek için genellikle akıllı olduğu anlamına gelir.

Yani bunu ing move sonra ya true veya false olmak için bir bool güvenemez.

+0

Ah ok tesekkurler, teste tabi tutulan tiplerin bir hareket yapıcıya sahip olmadıklarını, yani bool b = std :: move (other.b) 'nin temelde sadece bir ödevi olduğunu gösteriyor. – NtscCobalt

+2

Bir ödev, bir hareket için tüm gereksinimleri karşılar ve üzerinde iyileştirmenin herhangi bir yolu yoktur. –

+0

@DavidSchwartz Evet Bir derleyici uyarısı veya umuyordum ki, std :: move() öğesi yalnızca türünde herhangi bir taşıma yapıcısı bulunmadığında atama için aşağı indirilir. – NtscCobalt

İlgili konular