Странная ошибка при использовании строки шаблона‹class InputIterator› (начало InputIterator, конец InputIterator);

Учитывая такой сегмент кода:

#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++ код имеет неправильный вывод.

Я очень странно отношусь к скобкам. Какая разница и почему?


person konjac    schedule 06.04.2012    source источник


Ответы (2)


Без «лишних» круглых скобок вы получаете «самый неприятный синтаксический анализ» C++ — вместо определения объекта с именем str с двумя istream_iterators для указания его инициализаторов он анализируется как объявление функции с именем str, которая возвращает string, и "stuff" в круглых скобках указывает типы принимаемых параметров.

person Jerry Coffin    schedule 06.04.2012

Это похоже на один из примеров проблемы "Самый неприятный синтаксический анализ C++". Похоже, компилятор интерпретирует оператор с () как объявление функции str, которая принимает два параметра. Добавляя (), вы сообщаете компилятору, что это объект, а не часть сигнатуры прототипа функции.

person Asha    schedule 06.04.2012