53 votes

L'argument par défaut dans le milieu de la liste des paramètres?

J'ai vu une déclaration de fonction dans notre code qui a regardé comme suit

void error(char const *msg, bool showKind = true, bool exit);

J'ai pensé d'abord que c'est une erreur, parce que vous ne pouvez pas avoir des arguments par défaut dans le milieu de fonctions, mais le compilateur a accepté cette déclaration. Quelqu'un a déjà vu ça? Je suis en utilisant GCC4.5. Est-ce un GCC extension?

La chose étrange est, si je prends ce dans un fichier séparé et d'essayer de compiler GCC il rejette. J'ai vérifié tout, y compris les options du compilateur utilisé.

60voto

Nawaz Points 148870

Que le code du travail si, dans la première déclaration de la fonction, le dernier paramètre a la valeur par défaut, quelque chose comme ceci:

//declaration
void error(char const *msg, bool showKind, bool exit = false);

Et puis dans le même champ d'application que vous pouvez fournir des valeurs par défaut pour les autres arguments (du côté droit), dans la dernière déclaration:

void error(char const *msg, bool showKind = true, bool exit); //okay

//void error(char const *msg = 0 , bool showKind, bool exit); // error

qui peut appelé comme:

error("some error messsage");
error("some error messsage", false);
error("some error messsage", false, true);

Démo en ligne : http://ideone.com/aFpUn

Remarque si vous fournissez la valeur par défaut pour le premier paramètre (à partir de la gauche), sans fournir de la valeur par défaut pour le second, il ne compile pas (comme prévu) : http://ideone.com/5hj46


§8.3.6/4 dit,

Pour les non-modèle de fonctions, par défaut les arguments peuvent être ajoutés plus tard les déclarations de fonction dans la même la portée.

Exemple de la Norme elle-même:

void f(int, int);
void f(int, int = 7);

La deuxième déclaration ajoute de la valeur par défaut!

Voir aussi §8.3.6/6.

9voto

John Dibling Points 56814

Le asnwer peut-être dans 8.3.6:

8.3.6 Des Arguments Par Défaut

6 Sauf pour les fonctions membres de la classe les modèles, les arguments par défaut dans un définition de fonction membre qui s'affiche à l'extérieur de la classe définition sont ajoutées à l'ensemble de par défaut arguments fournis par le membre de la déclaration de la fonction dans le définition de la classe. Les arguments par défaut pour une fonction membre d'une classe le modèle doit être mentionné sur la première déclaration du membre fonction au sein de la classe de modèle. [Exemple:

class C {
void f(int i = 3);
void g(int i, int j = 99);
};
void C::f(int i = 3) // error: default argument already
{ } // specified in class scope
void C::g(int i = 88, int j) // in this translation unit,
{ } // C::g can be called with no argument

fin de l'exemple]

Après cette lecture, j'ai trouvé que MSVC10 accepté la suite avec compilateur extensions désactivées:

void error(char const* msg, bool showKind, bool exit= false);

void error(char const* msg, bool showKind = false, bool exit)
{
    msg;
    showKind;
    exit;
}

int main()
{
    error("hello");
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X