Les différentes significations de parenthèses en C++?
Je suis un peu confus withnthe interprétation de parenthèses par le compilateur. Certains ont-ils un s'il vous plaît expliquer ce qui se passe réellement dans de tels contextes?
Casting: (int)a
ou int(a)
Passage de paramètres:
template <typename t>
int size(t (&)[n]){return n;}
Évidemment, il pourrait y avoir de nombreux contextes différents où les parenthèses de modifier le sens ou l'interprétation. Certains ont-ils un s'il vous plaît expliquer ce exaactly qui se passe derrière le rideau? Comment le compilateur de savoir comment interpréter dans chaque contexte? Est-il un principe général ou est-ce une règle spécifique pour chaque cas?
Grâce
Crochets
Vrai. Je ne suis pas en se référant à eux comme des parenthèses ici. Merci pour le modifier.
<
et >
ne sont pas entre parenthèses.Vrai. Je ne suis pas en se référant à eux comme des parenthèses ici. Merci pour le modifier.
OriginalL'auteur Kiran | 2011-02-19
Vous devez vous connecter pour publier un commentaire.
Capitaine Pédant à la Rescousse!
Si vous écrivez
C'est ce qui est connu comme une une conversion de type explicite et est régi par le §5.2.3. Le libellé exact dit que
(Mon emphase). Cela signifie donc que
et
sont complètement identiques l'un à l'autre. C'est à vous de choisir celui de ces vous trouvez plus facile à écrire.
Quant à votre deuxième question, dans l'exemple que vous avez donné avec les modèles et le tableau, je crois que ce que vous avez voulu écrire quelque chose comme cela.
Ici,
N
ainsi queT
est un paramètre du modèle, qui permet de passer dans tous les tableau que vous souhaitez tout en ayant le compilateur remplirN
avec le nombre d'éléments dans le tableau. Dans le cas où cela ressemble à confusion (ce qui sur terre estT (&)[N]
?), c'est parce que cette fonction prend un paramètre de typeT (&)[N]
. Pour rendre cela un peu plus facile à lire, nous allons donner à ce paramètre un nom, comme illustré ici:Je pense que cela rend un peu plus facile à lire. Mais que fait cette déclaration signifie?
Il déclare une variable appelée
array
qui est une référence à un tableau deT
s exactementN
éléments. En effet, vous pouvez déclarer les références à des tableaux, comme vous pouvez déclarer des pointeurs de tableaux. Ce n'est pas très commun dans la pratique, mais dans ce modèle particulier idiome est une excellente façon d'avoir le compilateur de déduire la taille du tableau pour vous comme il essaie de faire correspondre le tableau à l'argument de modèle.La raison pour laquelle les parenthèses dans ce cas est que si vous écrivez
Le compilateur aurait analyser cela comme "une variable appelée
array
c'est un tableau deN
objets, dont chacun est unT&
. Cependant, le C++ spec exclut expressément les tableaux de références, et ce serait illégal. Les parenthèses explicitement lever l'ambiguïté. Ceci est similaire à des pointeurs de fonction - vous écrireau lieu de
De faire le compilateur de réaliser que le
*
signifie quefunctionPointer
est un pointeur, plutôt qu'une fonction qui retourne unvoid *
.Quant à la façon dont le compilateur détermine quand traiter des parenthèses dans chaque sens, les règles sont assez complexes et il y a effectivement quelques circonstances dans lesquelles le compilateur va pas analyser votre expression de la manière prévue. L'un de ces cas est quelque chose familièrement appelé "la plus délicate à analyser" dans lequel le compilateur traite de ce qui ressemble à la construction de l'objet comme un prototype de fonction. Comme un exemple, ce code:
Ne pas créer un
vector<int>
appelév
initialisée à l'aide du constructeur par défaut. Au lieu de cela, il traite cela comme un prototype de fonction pour une fonction appeléev
qui ne prend pas d'arguments et produit unvector<int>
! Toutefois, si vous deviez écrirePuis le compilateur peut déduire sans ambiguïté que c'est une déclaration d'un
vector<int>
passant10
comme un argument du constructeur, car il n'y a aucun moyen qu'il pouvait être considéré comme un prototype de fonction. §6.8 et le paragraphe 8.2 de la spec s'occupe de ces cas, en disant que tout ce qui peut être considéré comme une déclaration sera, et tout ce qui peut être considéré comme une fonction de prototype sera ainsi.Le cas des parenthèses dans le contexte de la matrice (qui est,
T (&array)[N]
) est traité par un autre morceau de la logique, car dans le contexte dans lequel vous êtes à la déclaration d'une variable ou de la définition d'un paramètre dont le type explicite de la parenthèse, il ne peut y avoir aucune ambiguïté au sujet de votre intention car il est clair à partir du contexte que vous attribuez un nom à un type pour déclarer une variable.Pour résumer -
T(value)
et(T)value
sont identiques.T (&array)[N]
pour empêcher le compilateur de liaison de la&
àT
au lieu dearray
comme prévu.Espérons que cette aide!
OriginalL'auteur templatetypedef
(int)est une fonte
int(a) est la construction d'un int, en passant un de l'int ctor
Expressions sont évaluées en fonction des opérateurs de priorité, arité, et si l'opérateur est de droite ou de gauche associative. Lire la priorité de l'opérateur graphique en C++ texte.
Obtenir une copie du programme c++decl; il lit C++ les expressions et les sorties de l'anglais la langue de l'explication de l'expression. Ou de lire cette explication.
Aussi cdecl.org est utile mais n'est pas entièrement le support C++. (Comme un test, il décrit une référence correctement, mais a dit qu'il est pris en charge dans C).
OriginalL'auteur tpdi