Question

Quel est le meilleur:

bool MyClass::someQuery() const;

const bool MyClass::someQuery() const;

J'utilise "const bool" depuis que je suis sûr de me souvenir avoir entendu dire que c'était "ce que font les ints". (par exemple, des opérateurs de comparaison), mais je ne trouve aucune preuve de cela nulle part, principalement en raison des difficultés rencontrées par Google et par Intellisense pour en aider aucune;) Quelqu'un peut-il confirmer cela?

Pour moi, renvoyer des valeurs const (il ne s’agit pas que de bools) a plus de sens; cela évitera les modifications temporaires, ce qui sera presque toujours une erreur du programmeur. Je veux juste quelque chose pour le sauvegarder afin de pouvoir louer des valeurs const à mes collègues:)

Était-ce utile?

La solution

Alors vous savez que c'est juste, vous êtes juste après la voix de l'autorité? Prévenir la modification accidentelle des temporaires est très précieux. En général, vous devez déclarer autant de choses que possible const , cela vous protège de nombreux accidents et donne à l’optimiseur des astuces utiles.

Vous avez une copie de "Effective C ++" de Scott Meyers autour? Pointez-les sur le point 3 (page 18 de la troisième édition);)

Cela donne l'exemple de

class Rational {...};
const Rational operator* (const Rational& lhs, const Rational& rhs );

if( (a * b) = c ) // declaring operator *'s return value const causes error to be caught by compiler

Autres conseils

C’est le cas lorsque const n’ajoute aucune valeur mais gonfle le code et incite le lecteur à réfléchir davantage. Quel est l'intérêt de ce const ? L'appelant peut copier la valeur dans une variable non-const et en faire ce qu'il veut quand même.

Notez que if ((a * b) = c) gagné ' De toute façon, compilez pour les types intégrés, il est donc très important que vous parliez des types intégrés (votre question demande bool ) ou des types définis par l'utilisateur.

Pour les types intégrés, cela n'a aucun sens, il ne devrait donc pas être utilisé. Et pour les types définis par l'utilisateur, je suis dans le camp de jalf: que se passe-t-il si l'appelant veut que modifie l'objet renvoyé?

Je ne suis pas convaincu que if ((a * b) = c) est un si bon argument pour renvoyer des types définis par l'utilisateur const, car je ne me souviens plus de la dernière fois que j'ai Nous avons vu un compilateur pas avertir à ce sujet.

Pour être un peu plus spécifique, seuls les "objets" peut être const. Définition de "objet" par la norme C ++ inclut tout ce que désigne une valeur ("a un nom") et des types temporaires de classe. Une valeur de retour booléenne est une valeur rvalue d'un type non-classe, raison pour laquelle un compilateur conforme aux normes ignorera simplement "const". dans ce cas. Comme d'autres l'ont déjà dit, cela ne sert à rien.

Lorsque vous renvoyez une référence à une variable membre, il est logique de la rendre constante. Ici, vous retournez une copie, vous n'avez donc pas besoin de const.

Le modificateur const est utilisé uniquement pour les types de retour renvoyés par référence (soit en tant que référence const SomeObject & , ou via un pointeur < code> const SomeObject * ), afin que l'appelant ne puisse pas modifier l'objet via la référence / le pointeur. Les types primitifs sont renvoyés par valeur , ce qui signifie que l'appelant reçoit une copie de l'objet, pas l'objet lui-même.

Par conséquent, const n'est pas vraiment approprié pour les types de valeur renvoyés. La copie étant en dehors du contrôle de la fonction appelée, celle-ci ne doit pas indiquer à l'appelant qu'elle ne peut pas être modifiée.

Cela n’a absolument aucune importance. Par conséquent, le consensus est de ne renvoyer que bool .

La raison pour laquelle cela n'a pas d'importance est que vous ne pouvez pas appeler des fonctions non-membres de toute façon; bool n'est pas une classe ou une structure.

Comme bool va être copié, c'est pareil, mettre const ou pas. De plus, vous aurez peut-être des problèmes de compilation.

type de retour const

  

SOMMAIRE:

     

La valeur d'un type de retour qui est   déclaré déclaré ne peut pas être changé. Ce   est particulièrement utile pour donner un   référence aux éléments internes d'une classe, mais   peut également empêcher des erreurs plus rares.

const bool func();
bool f = func();

0 erreurs, 0 avertissements. Qu'avez-vous accompli en dehors de l'inflation inutile de code?

C’est un article ancien, mais je pense qu’il est utile de mentionner qu’il existe un cas potentiel d’angle ici depuis C ++ 11. Bien que, comme d'autres l'ont indiqué, le fait d'utiliser const bool ou bool comme type de retour ne fera aucune différence dans la plupart des cas, si vous utilisez C ++ 11 decltype et associés, par exemple result_of , vous pouvez déclarer une variable avec le même type que la valeur renvoyée par une fonction, le const aurait donc un effet dans ce cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top