9
votes

Quelles garanties que la méthode surchargée non-Const est invoquée?

Compte tenu de ces 2 fonctions qui modifient et renvoient une chaîne: xxx

Ce code fonctionne pour moi à l'aide de GCC G ++, mais je ne comprends pas pourquoi / comment. Je serais inquiet que la deuxième fonction s'appelle elle-même, me laissant une récursion hors de contrôle jusqu'à ce que la pile soit épuisée. Est-ce garanti de travailler?


3 commentaires

Ceci est la récursion de la queue, probablement. Je ne suis pas sûr que la sémantique de transformer un const-ref appel à une boucle, alors ne postez pas de réponse, mais cherchez la récursion de la queue et vous trouverez plus d'informations.


@Peachykeen: Non, ce n'est pas du tout une récursion.


Envisagez de choisir un titre qui concentre la question mieux - par exemple. "Quelles garanties que la méthode surchargée non-Const est invoquée?"


3 Réponses :


3
votes
return modify( s ); // could this not call the "const" version again?
No. It is not recursion. It would invoke the other overload whose parameter is std::string &. It is because the type of the expression s is std::string & which matches with the parameter type of the other overloaded function.In order to recurse, the argument at call-site needs to convert into std::string const &. But in your case, this conversion is unnecessary as there exists an overload  which doesn't require conversion.

0 commentaires

9
votes

Vous avez deux fonctions surchargées:

std::string &modify( std::string &str )
std::string modify( const std::string &str )


0 commentaires

1
votes

Ce n'est pas une récursion, il est surcharge. Lorsque vous appelez la deuxième fonction, l'argument entrant est une chaîne constante. À l'intérieur de cette fonction, vous appelez l'autre fonction qui prend une chaîne sans const. Ce que vous faites, c'est décaper la const-ness de la chaîne et une meilleure façon de faire cela serait d'utiliser const_cast.

Je vais simplement créer un lien vers cet autre fil StackoverFlow.


2 commentaires

Je ne veux pas supprimer la constance. Cela entraînerait une chaîne apparemment de consensions à modifier!


Ce que vous pouvez faire, c'est attribuer la chaîne non-consons en faisant quelque chose comme: std & str2 = const_cast (str). STR restera constante mais vous serez capable de modifier Str2 tout ce que vous voulez.