basit struct
böyleneden bir harekete geçirici ekleyen ilk liste listesini devre dışı bırakıyor? Ile
struct Foo { int i; };
Bir başlatıcı listesi kullanarak yeni bir örneğini oluşturabilir
; Şimdi bir hamle yapıcısı
struct Bar
{
int i;
Bar(Bar&& other) { i = other.i; }
};
başlatıcı artık çalışmıyor
eklerseniz
Foo foo { 314 };
ve ben de bir yapıcı eklemek zorunda: gerek bir kurucu yazmaya
Bar(int i) : i(i) {}
I Bu davranışın bir şekilde this answer (user-defined move-constructor disables the implicit copy-constructor? için) ile ilgili olduğunu tahmin ediyorum, ancak daha fazla ayrıntı güzel olurdu.
Düzenleme: Düzenlemelerde belirtildiği gibi, bu bir kurucu eklemeyle ilgilidir.
(evet, bu aslında varsayılan yapı başlatıcısı rağmen "hareket" için biraz farklı bir sözdizimi ile tekrar çalışırolduğunu
struct Baz
{
int i;
Baz& operator=(Baz&& other)
{
this->i = other.i;
return *this;
}
};
: Sadece bir hareket operatörü eklerseniz sırayla Hangi tür bir tutarsızlık oluşturmak gibi görünüyor
Baz baz{ 3141 };
Baz b;
b = std::move(baz);
, 'b' varsayılan inşa olacak ve atanan hareket, sadece farklı değil sözdizimi –
keşke gerçek vaka farklı olduğunu varsayalım ama hareket semantik hakkında hiçbir şeyin sizi gerektirir unutmayın * Net * kaynak nesne (özellikle 'int's gibi önemsiz üyeleri değil). Sadece onu imha etmenin güvenli olduğu bir yerde bırakmak, mümkün olan tüm kaynakları yeniden kullanmak. Bir vektörün boş bir vektör için değiştirilmesi noktası, örneğin, temeldeki dizinin * sahipliğinin * (klonlanmış içeriklerin yerine) iletilmesidir ve yine de kaynakta bir şey vardır; Taşınan nesnenin boş içeriği olması gereklidir. –
@ TheVee teşekkürler; kaynağı temizlememek için düzenlenmiş. –