3

そのようなコードセグメントが与えられた場合:

#include <iostream>
#include <iterator>
#include <fstream>
#include <string>
using namespace std;
int main(){
    ifstream file("1.txt");
    string str((istream_iterator<char>(file)),istream_iterator<char>());
    file.close();
    cout<<str<<endl;
}

このコードは、istream_iteratorを使用してファイルから文字列を作成します。

文字列コンストラクターの最初のパラメーターが括弧のペアで囲まれていることに注意してください。かっこを省略するとエラーになります。VC ++ 2008では、リンクエラーが発生します。G ++では、コードの出力が間違っています。

かっこがとても不思議です。違いは何ですか、そしてその理由は何ですか?

4

2 に答える 2

5

「余分な」括弧がないと、C ++の「最も厄介な解析」が得られます。2つのistream_iteratorsで名前が付けられたオブジェクトを定義して初期化子を指定する代わりに、を返すstrという名前の関数の宣言として解析され、「もの」が返されます。括弧内は、使用するパラメーターのタイプを指定します。strstring

于 2012-04-06T05:56:56.590 に答える
1

これは、「C++で最も厄介な解析」問題の例の1つのように見えます。コンパイラは、2つのパラメータを受け入れる()関数の関数宣言としてステートメントを解釈しているようです。str追加()することにより、それがオブジェクトであり、関数プロトタイプシグネチャの一部ではないことをコンパイラに通知します。

于 2012-04-06T05:56:49.287 に答える