2014-09-08 20 views
19
aşağıdaki C++ 11 kod benim GCC 4.8 başarıyla derler

:C++ 11 özel varsayılan yapıcı

struct NonStack 
{ 
private: 
    NonStack(){} 
}; 

NonStack a; 

int main() { } 

Neden ilk yapar: Aşağıdaki bir derleme hata veriyor Bununla

struct NonStack 
{ 
private: 
    NonStack() = default; 
public: 
    static NonStack* Create(){ 
    return new NonStack; 
    } 
}; 
NonStack a; 

int main() { } 

biri başarılı mı? Özel varsayılan yapıcı, NonStack a; aracılığıyla bir nesnenin oluşturulmasını yasaklamamalı mı?

+2

Kodunuz gcc4.8 üzerinde gerçekten [derleme] (http://coliru.stacked-crooked.com/a/55199811d96f1af7) yapar, ancak 4.9 bunu gerektiği gibi reddeder. – Praetorian

+8

Bu soruda bir soru varsa daha iyi olurdu. –

+0

Ayrıca yapıcıyı da silebilirsiniz '=; Beklendiği gibi davranmalıdır. – glampert

cevap

17

Bu gcc hatası 54812, derleyici açıkça varsayılan özel üye işlevleri için erişim belirtecilerine uymamakta başarısız olur. Daha öncekinin bir kopyası olarak işaretlenen Hata 56429, sorudaki örnekle neredeyse aynı olan bir test durumuna sahiptir.

Çözümler, sorunu çözen gcc4.9'a yükseltmektir. Veya ikinci örnekte yaptığınız gibi, açık bir şekilde varsayılan olarak değil, yapıcı için boş bir gövde oluşturun.

+3

Not: bu hata [temel dil sorunu 1507] ile bağlantı kurar (http: //www.open- std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1507). GCC'de bir böcek değildi. Standart, yapıcı önemsiz olduğundan, yapıcının çağrılmadığını ve kurucunun çağrılmaması halinde 'özel' bir sorun olmadığını söylemek için gerçekten kullanmıştır. – hvd

+0

@ hvd Özel önemsiz kurucunun erişilemez ancak iyi biçimlendirilmiş olması standart bir kusur olduğunu kabul etti, ancak gcc hata raporu hala bir hatayı gösteriyor çünkü bu mantığı erişilemez önemsiz yıkıcılara uyguluyorlar. Cevap daha iyi olsa da daha iyi bir şekilde ifade edilebilirdi ve bunu bir süre sonra güncelleyeceğim. – Praetorian

+0

Doğru, özledim, standart daha uzun süre için uygun bir ifadeye sahipti. Belki de ilginin, standardın hala ulaşılamaz bir önemsiz yıkıcıya sahip olan eksik bir sınıf tipine bir işaretçiyi silmeye karşı bir yasaklamaya sahip olmadığı görülüyor, sadece yıkıcı gerçekten önemsiz ise tanımlanmamış bir davranış. – hvd