ホームページ >バックエンド開発 >C++ >C で `vector v(istream_iterator(cin), istream_iterator());` が関数を宣言するのはなぜですか?

C で `vector v(istream_iterator(cin), istream_iterator());` が関数を宣言するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-23 14:54:24393ブラウズ

Why Does `vector v(istream_iterator(cin), istream_iterator());` Declare a Function in C  ?

最も厄介な解析における一時イテレータの複雑なケース

最も厄介な解析、C の悪名高い解析の曖昧さは、困惑を引き起こす質問: 次の行は関数としてどのように解釈できますか?宣言?

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

この奇妙な動作を理解するには、最も厄介な解析の詳細を掘り下げる必要があります。 2 番目の一時反復子は、実際には型、つまりパラメーターのない反復子を生成する関数として解釈できます。ただし、重要なのは、最初の一時イテレータの解釈を理解することにあります。

2 番目のイテレータとは異なり、最初の一時イテレータはかっこで囲まれていてわかりにくく、明示的なパラメータ名がありません。 C の伝統であるこの型破りな構文は、「この反復子はどのような型を表しているのですか?

」という質問を引き起こします。その答えは、istream_iterator(cin) が本質的に istream_iterator と同等であるということです。シン。括弧は意味のある目的を持たず、単に余分なだけです。この奇妙な構文を使用すると、関数宣言で任意に引数名を括弧で囲むことができます。

結局のところ、このコードの複雑な性質は、この古い構文への依存から生じています。最初のパラメータが istream_iterator であることを宣言します。シンという名前。この予期しない動作は、このような構文遺物の欠点を強調し、コードの混乱や曖昧さを引き起こす可能性があります。

以上がC で `vector v(istream_iterator(cin), istream_iterator());` が関数を宣言するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。