Vous ne pouvez pas utiliser un littéral constant comme paramètre par défaut pour la même raison que vous ne pouvez pas en utiliser un comme paramètre de l'appel de fonction. Les valeurs de référence doivent avoir une adresse, les valeurs de référence constantes n'en ont pas besoin (c'est-à-dire qu'elles peuvent être des valeurs r ou des littéraux constants).
int* foo (int& i )
{
return &i;
}
foo(0); // compiler error.
const int* bar ( const int& i )
{
return &i;
}
bar(0); // ok.
Assurez-vous que votre valeur par défaut a une adresse et tout ira bien.
int null_object = 0;
int Write(int &state = null_object, bool sequence = true)
{
if( &state == &null_object )
{
// called with default paramter
return sequence? 1: rand();
}
else
{
// called with user parameter
state += sequence? 1: rand();
return state;
}
}
J'ai utilisé ce modèle à plusieurs reprises lorsque j'avais un paramètre qui pouvait être une variable ou nul. L'approche habituelle consiste à demander à l'utilisateur de passer un pointeur, ce qui est le cas. Il passe un pointeur NULL s'il ne veut pas que vous remplissiez la valeur. J'aime l'approche de l'objet nul. Elle facilite la vie de l'appelant sans compliquer terriblement le code de l'appelé.