web-dev-qa-db-fra.com

Les parenthèses autour du résultat sont-elles significatives dans une déclaration de retour?

Y a-t-il une différence entre ces deux instructions à l'intérieur d'une fonction?

bool returnValue = true;
// Code that does something
return(returnValue);

et ça?

bool returnValue = true;
// Code
return returnValue;

Le premier a des parenthèses autour de returnValue.

74
Jose Villalta

Depuis C++ 14, ils le sont souvent.

C++ 14 ajoute un cas marginal où les parenthèses autour d'une valeur de retour peuvent modifier la sémantique. Cet extrait de code montre deux fonctions en cours de déclaration. La seule différence est entre parenthèses autour de la valeur de retour.

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

Dans le premier func1 Renvoie un int et dans le second func1 Renvoie un int&. La différence de sémantique est directement liée aux parenthèses environnantes .

Le spécificateur auto dans sa dernière forme a été introduit en C++ 11. Dans le C++ Language Spec il est décrit comme:

Spécifie que le type de la variable déclarée sera automatiquement déduit de son initialiseur. Pour les fonctions, spécifie que le type de retour est un type de retour de fin ou sera déduit de ses instructions de retour (depuis C++ 14)

De plus, C++ 11 a introduit le spécificateur decltype qui est décrit dans le C++ Language Spec :

Inspecte le type déclaré d'une entité ou interroge le type de retour d'une expression.

[couper]

  1. Si l'argument est soit le nom sans parenthèse d'un objet/fonction, soit une expression d'accès aux membres (object.member ou pointer-> member), alors le decltype spécifie le type déclaré de l'entité spécifiée par cette expression.

  2. Si l'argument est une autre expression de type T, alors

    a) si la catégorie de valeur de l'expression est xvalue, le decltype spécifie T &&

    b) si la catégorie de valeur d'expression est lvalue, alors le decltype spécifie T &

    c) sinon, decltype spécifie T

[couper]

Notez que si le nom d'un objet est entre parenthèses, il devient une expression lvalue, donc decltype (arg) et decltype ((arg)) sont souvent des types différents.

En C++ 14, la possibilité d'utiliser decltype(auto) était autorisée pour les types de retour de fonction. Les exemples originaux sont ceux où la différence sémantique avec les parenthèses entre en jeu. Revisiter les exemples originaux:

int var1 = 42;
decltype(auto) func1() { return var1; } // return type is int, same as decltype(var1)
decltype(auto) func1() { return(var1); } // return type is int&, same as decltype((var1))

decltype(auto) permet de déduire le type de retour de fin de la fonction de l'entité/expression dans l'instruction return. Dans la première version, return var1; Revient en fait à renvoyer le type decltype(var1) (un int retourne le type par la règle 1 ci-dessus) et dans le second cas return (var1); c'est en fait la même chose que decltype((var1)) (un type de retour int & selon la règle 2b).

Les parenthèses font le type de retour int& Au lieu de int, donc un changement de sémantique. Morale de l'histoire - "Toutes les parenthèses sur un type de retour ne sont pas créées égales"

101
Michael Petch

Il n'y a pas de différence.

Une raison d'utiliser des parenthèses serait si vous vouliez évaluer une expression avant de revenir, mais dans votre exemple, il n'y aurait aucune raison. Voir:

parenthèses entourant les valeurs de retour

pour de plus amples discussions.

6
Karl Rosaen

AFAIK, rien n'est différent.

En C++, les expressions peuvent avoir la forme: expr ou (expr). Donc, ce dernier est une expression avec plus de typage. Pour plus d'informations à ce sujet, reportez-vous à ne grammaire (recherchez "expression").

4
David Weiser

Les parenthèses sur l'exemple supérieur sont superflues; ils sont effectivement ignorés.

Ce serait la même chose que quelque chose comme ...

int x = (5);

Les parenthèses ici sont également ignorées.

4
James

Non, il n'y a pas de différence dans votre code.

3
Elalfer

Je suppose que boo est une faute de frappe, et vous demandez s'il y a une différence entre

return expr;

et

return(expr);

La réponse est non.

3
aschepler

Non, il n'y a pas de différence entre les deux, bien que vous puissiez inclure des parenthèses si cela rend l'expression facile à lire et à clarifier.

2
sanchit.h

Vous ralentissez abusivement le compilateur!

La présence de parenthèses ralentit non seulement la phase de prétraitement, mais génère également un arbre de syntaxe abstraite plus compliqué: plus de mémoire, plus de calcul.


D'un point de vue sémantique? Ils sont exactement identiques. Qu'il y ait des parenthèses ou non, l'instruction return évaluera complètement l'expression avant de la renvoyer.

1
Matthieu M.

Aucune différence!!

Les gens utilisent des parenthèses s'il y a une expression complexe impliquée.

BTW return est une instruction et non une fonction.

1
Prasoon Saurav

Ils sont identiques. Je vois assez souvent la syntaxe des parenthèses, et je demande toujours à ceux qui l'utilisent: pourquoi? Et personne ne peut expliquer pourquoi ils l'utilisent.

Pour résumer franchement, les parenthèses autour des expressions renvoyées sont utilisées par des personnes qui ne comprennent pas tout à fait la différence entre les macros de fonction et les fonctions, ou qui sont confus quant à la priorité de l'opérateur ou à l'ordre des règles d'évaluation en C. Il n'y a pas de codage avantage de style d'utiliser des parenthèses.

Donc

return value;

est plus correct que

return (value)

car ce dernier suggère que vous ne savez pas très bien ce que vous faites :)

0
Lundin