Maison >développement back-end >C++ >Comment `vector v(istream_iterator(cin), istream_iterator());` peut-il être interprété comme une déclaration de fonction en C ?

Comment `vector v(istream_iterator(cin), istream_iterator());` peut-il être interprété comme une déclaration de fonction en C ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-16 12:13:10222parcourir

How Can `vector v(istream_iterator(cin), istream_iterator());` Be Interpreted as a Function Declaration in C  ?

L'analyse la plus vexante : clarifier un détail déroutant

En programmation, "l'analyse la plus vexante" fait référence à une ambiguïté notoire dans la syntaxe C cela peut conduire à des déclarations de fonctions inattendues. Cet article vise à démêler l'un de ces aspects déroutants de l'analyse la plus délicate.

Considérez la ligne de code suivante :

vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());

Comment cette ligne peut-elle être analysée comme une déclaration de fonction ?

Comprendre la syntaxe

Normalement, le plus Un problème d'analyse vexant survient lorsqu'un deuxième objet temporaire est interprété comme une fonction renvoyant un itérateur et ne prenant aucun argument. Cependant, dans ce cas, c'est le premier objet temporaire, istream_iterator(cin), qui pose le dilemme.

Le premier objet temporaire, istream_iterator(cin), est identique à istream_iterator< int> cin avec des parenthèses superflues. Cette syntaxe a été empruntée au C et a été reconnue comme une erreur.

L'interprétation

Le compilateur interprète istream_iterator(cin) comme une déclaration d'un paramètre nommé cin, qui est de type istream_iterator. Les parenthèses n'affectent pas la signification de l'instruction.

Par conséquent, la ligne de code est interprétée comme une déclaration de fonction avec un paramètre, cin, qui est de type istream_iterator. La fonction renvoie un vecteur d'entiers.

Parenthèses arbitraires dans les listes d'arguments

Les parenthèses autour de cin dans istream_iterator(cin) n'indiquent pas qu'il s'agit d'un argument d’une fonction entre parenthèses. Au lieu de cela, ils entourent simplement une expression qui s'évalue à une valeur de type istream_iterator.

Conclusion

La clé pour comprendre ce cas est de reconnaître que le superflu les parenthèses ne modifient pas le sens de la déclaration. L'interprétation de istream_iterator(cin) en tant que type de paramètre, plutôt qu'en tant qu'appel de fonction entre parenthèses, élimine la confusion dans cet exemple particulier de l'analyse la plus vexante.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn