Con regole veramente pedanti, sì, il codice richiede una definizione per quel numero intero statico. Ma con regole pratiche e ciò che tutti i compilatori implementano perché è così che sono intese le regole di C++ 03 - no, non è necessaria una definizione.
Le regole per tali numeri interi costanti statici consentono di omettere la definizione se il numero intero viene utilizzato solo in situazioni in cui un valore viene letto immediatamente e se il membro statico può essere utilizzato in espressioni costanti.
Nella dichiarazione di reso, il valore del membro viene immediatamente letto, quindi è possibile omettere la definizione del membro intero costante statico, se questo è l'unico uso di esso. Tuttavia, la seguente situazione richiede una definizione:
struct A {
static const int a = 5;
struct B {
static const int b = a;
};
};
int main() {
int *p = &A::B::b;
}
Nessun valore viene letto qui - ma viene preso l'indirizzo. Pertanto, lo scopo dello standard C++ 03 è che devi fornire una definizione per il membro come il seguente in alcuni file di implementazione.
const int A::B::b;
Nota che i effettivi regole che appaiono in C++ 03 standard dice che una definizione non è richiesto solo quando viene utilizzata la variabile in cui un'espressione costante è necessaria . Questa regola, tuttavia, se applicata rigorosamente, è troppo severa. Ti permetterebbe solo di omettere una definizione per situazioni come le dimensioni dell'array - ma richiederebbe una definizione in casi come un'istruzione return. Il rapporto del difetto corrispondente è here.
La dicitura di C++ 0x è stata aggiornata per includere la risoluzione del rapporto di errore e per consentire il codice come scritto.
fonte
2009-08-21 14:42:17
Il codice _aggiunge_ contiene una definizione per 'a'. –
No, non contiene una definizione. –
@Henk. Non proprio. Prova a passare l'indirizzo di 'a' o 'b' a una funzione e vedi quale messaggio genera il compilatore! –