Par des règles vraiment pédantes, oui, votre code a besoin d'une définition pour cet entier statique. Mais par des règles pratiques, et ce que tous les compilateurs implémentent parce que c'est ainsi que les règles de C++ 03 sont prévues - non, vous n'avez pas besoin d'une définition. Les règles pour ces entiers constants statiques sont destinées à vous permettre d'omettre la définition si l'entier est utilisé uniquement dans des situations où une valeur est immédiatement lue, et si le membre statique peut être utilisé dans des expressions constantes.
Dans votre déclaration de retour, la valeur du membre est immédiatement lue, vous pouvez donc omettre la définition du membre de l'entier statique statique si c'est la seule utilisation. Toutefois, la situation suivante nécessite une définition:
struct A {
static const int a = 5;
struct B {
static const int b = a;
};
};
int main() {
int *p = &A::B::b;
}
Aucune valeur n'est lue ici, mais l'adresse est prise en compte. Par conséquent, l'objectif de la norme C++ 03 est que vous devez fournir une définition pour le membre comme suit dans un fichier d'implémentation.
const int A::B::b;
Notez que les réelles règles figurant dans le 03 C++ standard dit qu'une définition n'est pas nécessaire que lorsque la variable est utilisée lorsque une expression constante est nécessaire . Cette règle, cependant, si elle est strictement appliquée, est trop stricte. Cela vous permettrait seulement d'omettre une définition de situation comme tableau-dimensions - mais nécessiterait une définition dans des cas comme une déclaration de retour. Le rapport de défaut correspondant est here.
Le libellé de C++ 0x a été mis à jour pour inclure cette résolution de rapport de défaut et pour permettre l'écriture de votre code.
Le code _does_ contient une définition de 'a'. –
Non, il ne contient pas de définition. –
@Henk. Pas vraiment. Essayez de passer l'adresse de 'a' ou 'b' à une fonction et voyez quel message le compilateur génère! –