2014-11-12 24 views
7

bölüm N3797::12.8/11 [class.copy] olarak tanımlanan kopya-yapıcı diyor vaka:dolaylı silinen

bir örtük ilan kopyalama/taşıma yapıcısı sınıfının bir satır içi toplu üyesidir. silinmiş olarak bir sınıfı X için Bir öntanımlı kopyalama/taşıma yapıcı tanımlanmıştır (8.4.3) X, varsa:

[...]

- sınıf tipi M olmayan bir statik veri elemanı (veya kopyalanamaz bunun dizisi)/ hareket için aşırı yük çözünürlüğü (13.3), E en temerrüde kurucuda kurucu, sonuç belirsiz bir veya silinir bir fonksiyonu veya erişilemez mukabil uygulanan

İlgili kopyalama/taşıma yapıcısının belirsizliği hakkındaki ilk durum oldukça açıktır. Aşağıdakileri yazabiliriz:

bunu yansıtmaktadır. Ancak ya da varsayılan yapılandırıcı'dan silinen veya erişilemeyen bir işlevden ne haber? Bu varsayılan kurucudan erişilemez bir işlevi ile ne var? Bunu yansıtan bir örnek verebilir misiniz?

+0

* Varsayılan yapıcı *, varsayılan varsayılan kurucu * değil diyor - bu varsayılan kopyasını/taşınıyor yapıcı –

cevap

6

Basitçe:

struct M { M(M const&) =delete; }; 
struct X { X(X const&) =default; M m; }; // X(X const&) is actually deleted! 

Daha açık bir ilan fonksiyonları "varsayılan" olarak kabul edilir ([dcl.fct.def.default]/5); Bir daha tanıdık öncesi C++ 11 örnek gibi bir şey olabilir: function örtük olacağını açıkça sonra işlevini varsayılan eğer ilan edildiğini

struct M { protected: M(M const&); }; 
struct X { M m; }; // X's implicit copy constructor is deleted! 

Not program kötü şekillendirilmiş olan silinen ([dcl.fct.def.default]/5): kopyalanamaz

struct M { M(M const&) =delete; }; 
struct X { X(X const&); M m; }; 

X::X(X const&) =default; // Not allowed. 
+2

+1'e atıfta, güzel [örnek] (http://coliru.stacked-crooked.com/a/51ef1acf1d514c68) – Niall

+0

Gerçekten, teşekkür ederim .. –

0

sınıf tipi M (ya da bunun bir dizi) olmayan bir statik veri elemanı/hareket için aşırı çözünürlüğü (13.3), M'ye tekabül eden kurucuya uygulandığı haliyle, bir ambigui ile sonuçlanır. ty veya kesinlikle özlü olmak kaygısıyla, silinmiş ya da öntanımlı yapıcı

ifadeler belki biraz yapmacık olduğunu erişilemez bir işlev. Yukarıdaki gibi vurgulanan fikir, numaralı telefonun numaralı Mkopya kurgusunun yüklenememesi nedeniyle aşırı yüklenilmesidir. Bu nedenle, kopya kurucusu protected olarak yapılmış olan M sınıfının bir üyesine sahip olmak'un kopya kurucusunu delete olur. Benzer şekilde, M'un kopya kurucusunu silmek aynı sonucu verirdi.

İlgili konular