2015-01-04 16 views
20

Ben bir otomatik değişken olarak kullanmasını benim sınıfının kullanıcı önlemek için istiyorum, bu yüzden böyle kod yazmak:"= default" destructor ve boş destructor arasındaki fark nedir?

class A { 
private: 
    ~A() = default; 
}; 

int main() { 
    A a; 
} 

ben kod derlenmiş olmayacağını bekliyoruz, ancak g ++ hatasız derler . Ben kodu değiştirdiğinizde

Ancak: Artık

class A { 
private: 
    ~A(){} 
}; 

int main() { 
    A a; 
} 

, g ++ beklentim olduğu gibi ~A(), özel olduğuna hata veriyor.

bir "= default" destructor ve boş yıkıcının arasındaki fark nedir?

+4

Gcc sürümü nedir? –

+1

Okuma örn. [Bu yıkıcı referans] (http://en.cppreference.com/w/cpp/language/destructor), fark kullanıcı tarafından sağlanan yıkıcı (boş bile) * önemsiz olmayan * olduğu ve aşağıdakiler arasından olmasıdır başvuru: "Önemsiz yıkıcılara sahip nesneler bir silme ifadesi gerektirmez ve yalnızca depolama alanlarını ayırarak imha edilebilir." Senin durumunda –

+8

her ikisi (http://coliru.stacked-crooked.com/a/41976bc03bc12c79) ilk örneği [gcc4.9 ve clang3.5 derlemeye reddeder], hiçbir fark yoktur. Gcc sürümünüzde bir hata olmalı. – Praetorian

cevap

23

İlk örnek derlemek olmamalıdır. Bu derleyicide derleme yaptığı bir hatayı temsil eder. Bu hata 4.9 ve üstü gcc ile giderilmiştir.

= default ile tanımlanan yıkıcı, bu durumda önemsiz şeklindedir. Bu std::is_trivially_destructible<A>::value ile tespit edilebilir.

Güncelleme

C++ 11 (ve C++ 14) devlet olduğunu biri kullanıcısının bildirdiği yıkıcı varsa (ve yok ya kullanıcısının bildirdiği özel bir üye taşırsanız) daha sonra kopya oluşturucu ve kopya ataması operatörünün örtük üretimi hala gerçekleşir, ancak bu davranış kullanımdan kaldırılır. Anlamı, eğer ona güvenirseniz, derleyiciniz size bir kullanım dışı bırakma uyarısı verebilir (ya da olmayabilir).

ikisi:

~A() = default; 

ve:

~A() {}; 

olan kullanıcısının bildirdiği ve bu yüzden bu noktada göre belirgin fark yoktur. Bu formlardan birini kullanırsanız (ve üyeleri taşımadığınızı beyan etmezseniz), kullanımdan kaldırılmış davranışlara güvenmemek için açıkça kopyalamanız, açıkça silmeniz veya açıkça belirtmeniz gerekir. Eğer (veya bir yıkıcı beyan olmadan) hareket üyelerini beyan yaparsanız

ardından kopya üyeleri örtülü silinir.

+2

@delphifirst: Derleyici hataları bu günlerde çok yaygın. Öğrenci olduğumda, 1980'lerin başında, herhangi bir ungood davranışın derlemede değil kodumuzda bir hata olduğunu öğrendik. Bugün düzenli olarak derleyicileri kilitlerim (ICE, Dahili Derleyici Hatası) ve sonra kimin hatası olduğu hakkında bir soru yok ... –

+0

@HowardHinnant: Bildirilene karşılık olmayan bazı tartışmaların bazılarını özlüyorum. Bunun, standardın "kullanıcı tarafından bildirilen" ifadesini kullanmasıyla ilişkili olduğunu düşünüyorum. C++ 'da 11 § 12.8/18. Lütfen? –

+0

@ Cheersandhth.-Alf: Yardım etmekten memnunum, ama sorunuzu anlamıyorum. Eğer bir '= varsayılan 'özel üyesinin kullanıcı tarafından bildirilip bildirilmediğini sorarsanız, cevap evet olur, ancak kullanıcı tarafından sağlanmaz. –

İlgili konular