Oznacza to, że gdy używasz stałej jako stałej, to tak, jakbyś używał stałej.
struct S {
static const int i = 0;
};
int main() {
return S::i;
}
Chociaż S::i
ma initialiser, że nie ma definicji, ale tekst w swoim pytaniu sprawia specjalny wyjątek dla zastosowań takich jak ta, gdzie S::i
jest dostępne tylko dla jego wartości. W takim przypadku definicja nie jest potrzebna.
Z drugiej strony, inne zastosowania wymagają definicji:
struct S {
static const int i = 0;
};
int f(const int &i) {
return i;
}
int main() {
return f(S::i);
}
Ten program jest nieważne, i jest akceptowana przez niektórych implementacjach, ale odrzucona przez innych. Wywołanie f
wymaga rzeczywistej definicji S::i
, aby istnieć, ale jeśli zostanie wstawiony znak f
, możliwe jest, że brak definicji nie zostanie zdiagnozowany.
W moim systemie, jeśli kompilacji i łączenia drugi program bez optymalizacji, otrzymuję:
$ 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
Aby to działało, definicja musi być zapewnione, tak:
struct S {
static const int i = 0;
};
const int S::i;
Jak Czy powinieneś odnieść się do pierwszego przykładu: "konwersja wartości do rvalue jest natychmiast stosowana"? –
Co masz na myśli przez "nie ma definicji"? – 0x499602D2
@WakeupBrazil 'S :: i' jest lwartością, jest używane w instrukcji' return' w funkcji zwracającej 'int'. W takim przypadku wartość l musi być (i jest) przeliczona na wartość r. (Nie chodzi o to, że jest on używany w samym słowie 'return': w funkcji zwracającej' int & ', konwersja l-do-r-wartości nie byłaby zastosowana.) – hvd