Expressions d'argument par défaut
Les expressions utilisées pour les arguments par défaut sont souvent des expressions constantes, mais ce n'est pas une obligation.L'expression peut combiner les fonctionnalités qui sont visibles dans la portée, les expressions constantes, les variables globales actuelles.l'expression ne peut pas contenir des variables locales ou des variables non statiques de membre de classe.Le code suivant illustre ce comportement :
BOOL CreateVScrollBar( HWND hWnd, short nWidth =
GetSystemMetrics( SM_CXVSCROLL ) );
La déclaration précédente spécifie une fonction qui crée une barre de défilement verticale d'une largeur données pour une fenêtre.Si aucun argument de largeur n'est fourni, la fonction API Windows, GetSystemMetrics, est appelé pour rechercher la largeur par défaut pour une barre de défilement.
L'expression par défaut est évaluée après l'appel de fonction, mais l'évaluation est effectuée avant l'appel de fonction se produit réellement.
Étant donné que les arguments formels à une fonction sont dans la portée de la fonction, et parce que l'évaluation des arguments par défaut a lieu avant l'entrée à cette portée, vous ne pouvez pas utiliser les arguments formels, ou des variables locales dans des expressions d'argument par défaut.
Notez que tout argument formel déclaré avant qu'une expression d'argument par défaut puisse masquer un nom global dans la portée de la fonction, qui peut générer des erreurs.Le code suivant est non conforme :
const int Categories = 9;
void EnumCategories( char *Categories[], int n = Categories );
Dans le code précédent, le nom global Categories est masqué à la portée de la fonction, mettant l'expression d'argument par défaut valide.