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;
nasıl İlk örneğinize "lvalue-to-rvalue dönüşüm hemen uygulanır" ifadesini ilişkilendirir misiniz? –
"Tanımlaması yok" ile ne demek istiyorsun? – 0x499602D2
@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