2011-10-26 19 views
7

Aşağıdaki örnekte, v dizisinin boyutu 2 veya 3 olarak mı garanti edilir? standart kaynaktan Sınıftaki üyelerin kapsamı

static const int i = 3; 

class X { 

    char v[i]; 
    static const int i = 2; 
}; 

bir sınıf S kullanılan bir ismi N kendi bağlamında aynı yazısına değinecektir

3.3.6/2

ve S tamamlanmış kapsamındaki yeniden değerlendirilir zaman

Bu 'i' 2 olacaktır demektir ve hangi yeniden değerlendirme şey gerçekten burada anlamı ne düşünüyorsunuz? Bölüm 3.3.6 den

Örnek:

cevap

4

doğru davranış ve tekrar değerlendirme anlamı değiştirecek çünkü bir hataya sebep olmasıdır

uzanan bir beyan potansiyel kapsamı veya Bir sınıf tanımının sonunu geçmiş, üye tanımları tarafından tanımlanan bölgelere de uzanır; üyeler sınıf dışında sözcüksel olarak tanımlanmış olsa bile (bu, statik veri üye tanımlarını, iç içe sınıf tanımlarını, üye işlev tanımlarını içerir (üye işlev gövdesi dahil) , kurucu işlevleri (12.1), ctor-başlatıcı (12.6.2)) ve decla'nın herhangi bir kısmı için Bir parametre-beyan-cümlesi ve herhangi bir varsayılan argümanı (8.3.6) içeren tanımlayıcıyı takip eden bu tanımların rator kısmı. [Örnek:

örneğin sizin benzerdir (yerine static const int arasında enum kullanılarak): zaman v[i] de

typedef int c; 
enum { i = 1 }; 
class X { 
    char v[i]; // error: i refers to ::i 
        // but when reevaluated is X::i 
    int f() { return sizeof(c); } // OK X::c 
    char c; 
    enum { i = 2 }; 
}; 

karşılaşıldığında, derleyici sadece yaklaşık enum { i = 1 }; bilir (veya static const int i = 3; ama ne tüm sınıf bildirimi biliniyor, char v[i] farklı olurdu çünkü yeniden değerlendirildi 2.

1

Dizi boyutu 3'tür. durumdur. Kod satırına satırdan bakarsanız. Compliler dizi inşa ederken X :: i hakkında hiçbir şey bilmiyor. Eğer dizinin büyüklüğü 2 ve ikincisine dönüştüğünde sınıf içindeki çizgileri değiştirirseniz, ilk önce saklayacağım.