2012-04-18 19 views
8

Aşağıdaki kod parçası ben hareket yapıcı çağrılacak bekledikleri yerden kopya yapıcı çağrılacak neden olur: hata ayıklama modunda, VS11 Beta günüBu kopya kurucusu neden taşıma kurucusundan ziyade çağrıldı?

#include <cstdio> 

struct Foo 
{ 
    Foo() { puts("Foo gets built!"); } 
    Foo(const Foo& foo) { puts("Foo gets copied!"); } 
    Foo(Foo&& foo) { puts("Foo gets moved!"); } 
}; 

struct Bar { Foo foo; }; 
Bar Meow() { Bar bar; return bar; } 
int main() { Bar bar(Meow()); } 

, bu baskılar:

Foo gets built! 
Foo gets copied! 
Foo gets copied! 

kontrol ettim standart ve Bar, otomatik olarak oluşturulmuş varsayılan bir hareket yapıcıya sahip olmak için tüm gereksinimleri karşılar gibi görünüyor, ancak nesnenin hareket ettirilememesinin başka bir nedeni olmadığı sürece böyle görünmüyor. Burada çok fazla hareket ve kopya yapıcı ile ilgili soruları gördüm, ama bu konuyla ilgili kimsenin olmadığını düşünüyorum.

Burada neler olduğuna dair herhangi bir işaretçi var mı? Bu standart davranış mı?

+0

Std :: move (bar); 'dönüşü var mıdır? BTW, gcc 4.7.0, hareket ettiriciyi çağırır (kopya elemenasyonu kapalıyken). –

+0

BTW, gcc 4.6.1, kopya veya taşıtı çağırmıyor. –

+0

g ++ 4.5.3 yalnızca şu nesneyi oluşturur: "Foo yerleşik!" (elemen kopyala), kopyala seçim devre dışıyken, nesneyi iki kez kopyalar. Bir hareket edicisi sadece bir rengin olduğu zaman çağrılmaz mı? Meow'un() uygun olduğuna emin değilim. –

cevap

8

Ne yazık ki, VS11 bir varsayılan taşıma kurucusu sağlamaz. Açıklamalar bölümünde Move Semantics gör - alıntı:

varsayılan kopya kurucu aksine, derleyici bir varsayılan hareket yapıcısı sağlamaz.

+0

Güzel yakalama, teşekkürler! Bu bir şekilde standart tarafından izin verilir mi? Değilse, Microsoft Connect'te bir hata açacağımı tahmin etsem bile. – Trillian

+0

MS, henüz yeni C++ 11 özelliklerinin tümünü uygulamayı henüz tamamlamadı. Http://msdn.microsoft.com/en-us/library/hh409293%28v=vs.110%29.aspx ve http://blogs.msdn.com/b/vcblog/archive/2011/ adresinde daha fazla bilgi var. 09/12/10209291.aspx – Fraser

+0

Lanet olsun, son VS11 sürümü için varsayılan hareket oluşturucu jenerasyonunu bile alamıyoruz: / – Trillian