Według naprawdę pedantycznych reguł, tak, twój kod potrzebuje definicji tej statycznej liczby całkowitej. Ale według praktycznych reguł i tego, co wszystkie kompilatory implementują, ponieważ tak właśnie mają być zasady C++ 03 - nie, nie potrzebujesz definicji.
Reguły dla takich stałych liczb całkowitych mają na celu umożliwienie pominięcia definicji, jeśli liczba całkowita jest używana tylko w takich sytuacjach, w których wartość jest natychmiast odczytywana, a element statyczny może być używany w wyrażeniach stałych.
W instrukcji return wartość elementu jest natychmiast odczytywana, więc można pominąć definicję statycznego stałego elementu całkowitoliczbowego, jeśli jest to jedyne użycie. Następująca sytuacja wymaga jednak zdefiniowania:
struct A {
static const int a = 5;
struct B {
static const int b = a;
};
};
int main() {
int *p = &A::B::b;
}
Nie ma tu żadnej wartości, ale zamiast tego jest pobierany jej adres. Dlatego intencją standardu C++ 03 jest zapewnienie definicji elementu podobnego do następującego w niektórych plikach implementacji.
const int A::B::b;
Uwaga że rzeczywiste zasady występujące w C++ 03 Standardu mówi, że definicja nie jest wymagane tylko wtedy, gdy używana jest zmienna, gdzie stała wyrażenie jest wymagane. Zasada ta jednak, jeśli jest ściśle stosowana, jest zbyt rygorystyczna. Pozwoliłoby to tylko na pominięcie definicji sytuacji, takiej jak wymiary tablicy - ale wymagałoby definicji w takich przypadkach jak instrukcja return. Odpowiedni raport o usterkach to here.
Sformułowanie C++ 0x zostało zaktualizowane, aby uwzględnić to rozwiązanie raportu o usterce i zezwolić na pisanie kodu.
Kod _does_ zawiera definicję "a". –
Nie, nie zawiera definicji. –
@ Henk. Nie całkiem. Spróbuj przekazać adres funkcji "a" lub "b" do funkcji i zobacz, jaki komunikat generuje kompilator! –