2010-11-21 39 views
9

Je travaille sur l'environnement Linux gcc et j'ai besoin d'initialiser les arguments de fonction qui sont des classes avec des valeurs par défaut. Quand je fais avec instance temporaire de la classe, il fait une erreur comme ceci: « argument par défaut pour [argument de la fonction] a taper [nom de la classe] par exemple:.comment initialiser les arguments de fonction qui sont des classes avec la valeur par défaut

void foo(std::wstring& str = std::wstring()) 

erreur: Argument par défaut pour ' std :: wstring & str » est de type 'std :: wstring' PS ce code est compilé sans aucune erreur ou d'avertissement avec VC++.

Comment puis-je initilize la valeur par défaut?

+0

ce que vous essayez d'atteindre? Pour moi, ça n'a pas de sens ce que vous faites .. – Simone

+0

@Simone - c'est probablement un essai pour obtenir à la fois des aventages de valeurs par défaut et d'envoyer par référence. – rkellerm

+0

La liaison à des références non-const n'est pas conforme à la norme, mais VC++ le permet comme extension AFAIK. –

Répondre

8

Ceci est supposé ne pas compiler. Vous essayez de lier un rvalue à une référence non-const. Dites std::wstring const & str et cela devrait fonctionner.

9

Vous pouvez tout simplement créer un surcharge de fonction:

void foo() { 
    std::wstring str; 
    foo(str); 
} 

mais je manque vraiment le point. Je veux dire que le but de cette fonction est presque certainement de modifier une chaîne d'entrée. Si vous fournissez une chaîne d'entrée vide à laquelle vous ne pouvez pas accéder plus tard, pourquoi s'embêter?

+0

Le but de la fonction peut également être d'obtenir la chaîne d'entrée sans la modifier du tout. Le passage par référence peut également servir à empêcher l'appel du constructeur de copie. – rkellerm

+0

Il y a beaucoup de situations où cela pourrait être utile, disons par exemple que ce n'est pas une chaîne, mais un tampon, ou que certaines données (comme les logs détaillés) sont mises là par la méthode mais que vous vous souciez seulement du résultat. Votre solution résout néanmoins le problème avec un code conforme standard :) –

+0

@ rursw1 oui, mais - dans ce cas - si vous ne passez pas une référence ** const **, je pense que l'interface de la fonction est en quelque sorte fausse. – Simone

3

Vous ne pouvez pas lier des références non const à des valeurs rvalues. En passant par la valeur travaillerait:

void foo(std::wstring str = std::wstring()) 

Ou passer par référence à const:

void foo(const std::wstring& str = std::wstring()) 
+0

Je ne comprends pas vraiment votre dernière phrase. Même si le compilateur n'optimise pas le temporaire et la copie coûte combien coûte la copie d'une chaîne vide? Et si le temporaire est élidé, que reste-t-il à déplacer? –

+0

@Charles: que se passe-t-il si un utilisateur * fournit * une chaîne en tant qu'argument? Ensuite, il doit être copié en C++ 03. – fredoverflow

+0

Désolé, je pensais que vous faisiez référence à l'utilisation de l'argument par défaut dans votre commentaire. Dans tous les cas, si l'utilisateur fournit une chaîne temporaire dans de nombreux cas, elle peut être élue en C++ 03. Une copie ne doit pas toujours arriver. –