ホームページ > バックエンド開発 > C++ > `vector v(istream_iterator(cin), istream_iterator());` は C の関数宣言としてどのように解釈できますか?

`vector v(istream_iterator(cin), istream_iterator());` は C の関数宣言としてどのように解釈できますか?

Susan Sarandon
リリース: 2024-12-16 12:13:10
オリジナル
222 人が閲覧しました

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

最も厄介な解析: 混乱を招く詳細の明確化

プログラミングにおける「最も厄介な解析」とは、C 構文の悪名高いあいまいさを指します。これにより、予期しない関数宣言が発生する可能性があります。この記事は、最も厄介な解析のこのような混乱を招く側面の 1 つを解明することを目的としています。

次のコード行を考えてみましょう:

vector<int> v(istream_iterator<int>(cin), istream_iterator<int>());
ログイン後にコピー

この行は関数宣言としてどのように解析できますか?

>

構文を理解する

通常、最も厄介な解析問題は、2 番目の一時オブジェクトがイテレータを返し、引数を取らない関数として解釈されるときに発生します。ただし、この場合、ジレンマを引き起こすのは最初の一時オブジェクト istream_iterator(cin) です。

最初の一時オブジェクト istream_iterator(cin) は、istream_iterator と同一です。整数>余分な括弧付きのcin。この構文は C から借用したものであり、誤りであることが認められています。

解釈

コンパイラは istream_iterator(cin) をパラメータの宣言として解釈します。 cin という名前で、タイプは istream_iterator です。括弧はステートメントの意味には影響しません。

したがって、コード行は、istream_iterator 型の 1 つのパラメーター cin を持つ関数宣言として解釈されます。この関数は整数のベクトルを返します。

引数リスト内の任意の括弧

istream_iterator

(cin) の cin を囲む括弧は、それが整数であることを示しません。括弧内の関数の引数。代わりに、istream_iterator 型の値として評価される式を単純に囲んでいます。

結論

このケースを理解するための鍵は、余分な括弧はステートメントの意味を変更しません。 istream_iterator(cin) を括弧内の関数呼び出しではなくパラメータ型として解釈することで、最も厄介な解析のこの特定の例における混乱が解消されます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート