2012-04-20 21 views
5

Hareket anlambilimini anlamak için aşağıdaki kodu yazdım. G ++ - 4.6'da beklendiği gibi çalışır (yani kopya ve sadece hamle) ancak g ++ - 4.7.0'da değil. Ben g ++ - 4.7.0 içinde bağlantı içinde bir hata olduğunu düşündüm ama bu link g ++ - 4.7 bir hata olmadığını söylüyor. Bu yüzden, yukarıdaki bağlantıdan anlaşılacağı gibi, kurşunun hareket etmesini sağladım ama yine de sadece kopya yapıyor. Ancak, kopya kurucusunun notunu verirsem, sadece yer değiştirir. Bunu açıklayan var mı?vektör, semantiği taşı, nothrow ve g ++ 4.7

#include <iostream> 
#include <vector> 
using namespace std; 

struct S{ 
int v; 
static int ccount, mcount; 
S(){} 
    //no throw constructor 
    //S(nothrow)(const S & x){ 
S(const S & x){ 
    v = x.v; 
    S::ccount++; 
} 
S(S&& x){ 
    v = x.v; 
    S::mcount++; 
} 
}; 

int S::ccount = 0; 
int S::mcount = 0; 
int main(){ 

vector<S> v; 
S s; 

for(int i = 0; i < 10; i++) { 
    v.push_back(std::move(s)); 
} 

cout << "no of moves = " << s.mcount << endl; 
cout << "no of copies = " << s.ccount << endl; 
return 0; 
} 

cevap

5

Nasıl "hamlesi yapıcıyı not almıyorsunuz"? Ben noexcept ile hareket yapıcısı açıklama eğer g ++ 4.7 ile, daha sonra örnek yalnızca hareket eder etmez:

S(S&& x) noexcept{ ... } 

no of moves = 25 
no of copies = 0 
+0

teşekkür ederiz. 'S (nothrow) (S && ​​x) {....} 'olarak yazdım. Ama sonra bu iki "nothrow" sürümleri arasındaki fark nedir? – suresh

+1

'noexcept', bir şeyi işaretlemeyen olarak işaretlemek için C++ 11 anahtar sözcüğüdür. Kullandığınız imza, "ref" değeriyle bir "S" alan ve bir "S" değerini döndüren "nothrow" adlı bir işlevi bildirir. –

+0

Bu şekilde kopyalama kurucusunu işaretlemenin neden g ++ 4.7, hareket yapıcısını kullandığını açıklar: sınıfınız artık ** bir kopya yapıcısına sahip (** yerine bir işlev değil), g ++ 4.7 "don" kelimesini izler t bir yürütme kurucusu varsa "kural, bu nedenle std :: vector", hareket ediciyi kullanmak zorundaysa, örtülü olarak bir kopya oluşturucu oluşturur. –