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 fonctions visibles dans la portée actuelle, les expressions constantes et les variables globales. L'expression ne peut pas contenir de variables locales ou de variables de classe de membre non statiques. 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ée pour une fenêtre. Si aucun argument de largeur n'est fourni, la fonction API Windows GetSystemMetrics est appelée pour rechercher la largeur par défaut d'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 que l'appel de fonction ne se produise réellement.
Étant donné que les arguments formels d'une fonction se trouvent dans la portée de la fonction et que l'évaluation des arguments par défaut a lieu avant l'entrée dans cette portée, vous ne pouvez pas utiliser d'arguments formels ou de variables locales dans les expressions d'arguments 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 peut entraîner 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é au niveau de la portée de la fonction, ce qui rend l'expression d'argument par défaut valide.