2013-07-19 16 views
9

Bu kod başarısının MS Visual C++ ile derlendiğini gördüğümde şaşırdım.Kurucu adından önce anahtar kelime yapısı

struct foo { 
    struct foo(int i): value(i) {} 
    int value; 
}; 

Ne tür garip içerikteki anahtar struct demektir?

+0

G ++ 4.8 ile benim için derleme yapmıyor. Ancak MS vs2010 derleyici bunu kabul eder. Tuhaf bir ayrıştırma hatası gibi kokuyor. Hangi derleyiciyi kullanıyorsunuz? – SteveLove

+0

[etiket: Visual-C++], MS-derleyici. Üzgünüm, bunu yazışmada yazmalıyım. –

+0

Neden düşüşler? Soru doğru ve aslında hiçbir uyarı olmadan VC++ (en azından VC++ 2010) derleniyor. Cevabı bilmemek, reddetmek için bir sebep değildir. Bunun standartlara aykırı olduğu da değil. – Gorpik

cevap

10

çoğu bağlamlarda, bunun yerine sadece sınıf adı foo arasında özenli tip belirticistruct foo, veya eşdeğer class foo kullanabilirsiniz. Bu belirsizlikleri çözmek amacıyla yararlı olabilir: sizin derleyici bu kodu kabul etmek yanlıştır yüzden, bir kurucu bildirirken

struct foo {}; // Declares a type 
foo foo;  // Declares a variable with the same name 

foo bar;  // Error: "foo" refers to the variable 
struct foo bar; // OK: "foo" explicitly refers to the class type 

Ancak, bu formu kullanamazsınız. Bir kurucu beyannamesi için şartname (C++ 11 12.1/1'de) sadece sınıf adıyla değil, ayrıntılı bir tür belirteci değil.

Genel olarak, Visual C++ her türden gizli kod derlediğinde şaşırmamalısınız. Standart olmayan uzantıları için bu dil ile ünlüdür.

+0

Başka bir ekleme var: struct varsayılanı herkese açıkken, özel mirasa sınıf varsayılanları. –

+5

@ IanM_Matrix1: Bir sınıf tanımında 'class' ve' struct' kullanımı arasındaki fark bu; fakat burada sınıf tanımlarından bahsetmiyoruz, sadece sınıf türüne başvurmak için kullanılan tanımlayıcıları yazınız. Orada 'class' ve' struct' kullanımı arasında fark yoktur. –

İlgili konular