2016-02-15 46 views
7

Sınıftaki hareket ettiriciyi devre dışı bırakmak istiyorum. Taşımak yerine, kopya kurucusuna dayandırmak istiyorum. Bu kod yazmak çalıştığınızda: derleme sırasındaTaşımacıyı devre dışı bırakma

class Boo 
{ 
public: 
    Boo(){} 
    Boo(const Boo& boo) {}; 
    Boo(Boo&& boo) = delete; 
}; 

Boo TakeBoo() 
{ 
    Boo b; 
    return b; 
} 

Ben hata aldı:

nasıl yerine hareket yapıcı ve kuvvet kopyaları devre dışı bırakabilir

error C2280: 'Boo::Boo(Boo &&)': attempting to reference a deleted function

?

class Boo 
{ 
public: 
    Boo(){} 
    Boo(const Boo& boo) {}; 
}; 

hareket yapıcı otomatik sürece kullanıcı tanımlı kopya yapıcı böylece kopya yapıcısı denir mevcut olduğu gibi oluşturulmaz:

+6

sadece hareket yapıcısı aşırı değil ve zaten standart itibaren bir kopyası yapıcısı –

+2

olmadığı derleyici bunun için bir hamle yapıcısı oluşturmaz: "Bir sınıf X tanımı açıkça beyan etmezse Bir taşıma kurucusu, bir kullanıcı tarafından bildirilen bir kopya oluşturucuya sahip değilse [X] bir kullanıcı tarafından bildirilen kopya oluşturucuya sahip değilse [...] Hareket ettirici örtülü olarak bildirilmediğinde veya açıkça sağlanmadığında, aksi takdirde harekete neden olabilecek ifadeler varsa, varsayılan olarak örtük olarak bildirilir kurucu bunun yerine bir kopya kurucuyu çağırır. " – Pixelchemist

+1

Bununla ne elde etmeyi umuyorsunuz? Hiçbir şekilde anlamlı görünmüyor. –

cevap

17

herhangi bir adımın yapıcı oluşturmayın.

+6

Bir kopya yapıcısı varsa * taşıma yapıcısı otomatik olarak oluşturulmaz *. OP'nin örneğinde bu durum söz konusudur, ancak bir okuyucu, hareket etmekten kaçınmak için hareket edicinin uygulanmasının yeterli olmadığı sonucuna varır. Örneğin, iki 'std :: vector' üyesine sahip bir sınıf ve örtülü olarak tanımlanmış herhangi bir kopyalama veya taşıma kurucusu, vektörleri hareket ettiren otomatik olarak oluşturulmuş bir hareket kurucuyu alır. – user4815162342

4

Bir işlevin =delete olarak işaretlenmesi işlevi aşırı yüklenme çözünürlüğü için kullanılabilir hale getirir, ancak seçiliyse, derleme başarısız olur; Bu işlev, kurucular ve diğer özel işlevler (see here) ile sınırlı değildir. Önceden (C++ 03 civarında) üye özel yapmak benzer bir sonuç elde etti.

Bu nedenle, örnekte olduğu gibi, kod, sınıfın bir nesnesinin oluşturulmasını geçici veya süresi dolmuş bir değerden (rvalues) - hareket yapıcısını - yasaklamanız anlamına gelir.

Bunu düzeltmek için, yapıcıyı tamamen kaldırın. Sınıf söz konusu olduğunda, bir kopya kurucusu mevcut olduğunda (kullanıcı tanımlı), hareket yine de örtük olarak üretilmez (yapıcıyı hareket ettir ve atama operatörünü hareket ettir).

class Boo 
{ 
public: 
    Boo(){} 
    Boo(const Boo& boo) {}; 
    //Boo(Boo&& boo) = delete; 
}; 
+2

Ekstra bilgi: hareket ettiriciyi silinmiş olarak işaretlemek, aslında aşırı yüklenme çözünürlüğünü mümkün kılar; Ancak, taşınma-yapıcı örtük olarak silinmiş olarak tanımlanmışsa (ör. bu üye değişkeni, taşınır yapıcısını silinmiş olarak, ister örtük isterse açıkça silindiyse olur), o zaman aşırı yüklenme için * mevcut değildir *. (aşırı yük çözünürlüğü eğlencelidir ...) –

İlgili konular