2014-05-06 40 views
6

cümle paragrafa ait §3.2/2:Bu cümle, C++ 11 Standardının §3.2/2 paragrafında ne anlama gelmektedir?

ismi potansiyel değerlendirilmesi ifadesi, bir görünen için gereksinimleri karşılayan bir amacı sürece ODR kullanılan olarak gösterilen bir değişken Sabit ifade (5.19) ve lvalue-to rvalue dönüşümü (4.1) hemen uygulanır.

Tam olarak cüret edilen cümle tam olarak ne anlama geliyor?

Düzenleme:

bu bir yinelenen kabul edildiği sorusunun cevabı, soruma cevap verebilir bir şey söylemez.

cevap

7

Bu, sabit olarak sabit kullandığınızda, aslında bir sabit kullandığınız anlamına gelir. S::i rağmen

struct S { 
    static const int i = 0; 
}; 
int main() { 
    return S::i; 
} 

hiçbir tanıma sahip, Başlatıcı bir var, ama sizin Söz konusu metin S::i sadece değeri için erişilen böyle kullanımlar için özel bir istisna yapar. Bu durumda, tanım gerekli değildir.

struct S { 
    static const int i = 0; 
}; 
int f(const int &i) { 
    return i; 
} 
int main() { 
    return f(S::i); 
} 

Bu program geçersiz ve bazı uygulamalarda tarafından kabul edilir, ancak diğerleri tarafından reddedildi: Öte yandan

, diğer kullanımları bir tanım gerektirir. f numaralı çağrıya, f belirtilmiş olsa bile, tanımlanamayan tanımın eksik olması mümkün olsa da, gerçek bir S::i tanımı gerektirir. Benim sistemde

, derleme ve optimizasyonlar olmadan ikinci bir program bağlama, ben alıyorum:

 
$ g++ test2.cc -o test2 
/tmp/ccdEsfxs.o:test2.cc:function main: error: undefined reference to 'S::i' 
collect2: error: ld returned 1 exit status 

çalışması için, bir tanım şöyle temin edilmesi gerekmektedir:

struct S { 
    static const int i = 0; 
}; 
const int S::i; 
+0

nasıl İlk örneğinize "lvalue-to-rvalue dönüşüm hemen uygulanır" ifadesini ilişkilendirir misiniz? –

+1

"Tanımlaması yok" ile ne demek istiyorsun? – 0x499602D2

+0

@WakeupBrazil 'S' bir değerdir,' dönüş' deyiminde 'int' döndüren bir işlevde kullanılır. Bu durumda, lvalue bir değere dönüştürülmelidir (ve). ('Return' deyiminde tek başına kullanılan bir gerçektir: int & 'döndüren bir işlevde, lvalue-to-rvalue dönüşümü uygulanmayacaktır.) – hvd