Ответ 1
Верьте или нет, эта строка не объявляет экземпляр std::vector
с именем results
, вызывая конструктор, начинающий и завершающий итератор:
std::vector<float> results(std::istream_iterator<int>(actualLineStream),
std::istream_iterator<int>());
Фактически объявляет функцию, называемую results
, которая принимает параметр с именем actualLineStream
и еще один неназванный параметр, оба типа std::istream_iterator<int>
.
Как правило, в С++, если что-то похоже на функцию, оно будет анализироваться как одно; это требует стандарт С++. Это действительно для обратной совместимости с C - но это настолько противоречиво, что у него даже есть свое имя: "самый неприятный синтаксический разбор" . Некоторые компиляторы даже выдают предупреждение, если он встречает наиболее неприятный синтаксический анализ.
Это связано с тем, что эти две строки не эквивалентны в С++:
Foo bar; // Declares an instance of Foo named bar
Foo bar(); // Declares a function named bar that takes no parameters and returns a Foo
Чтобы исправить это, вы можете добавить больше круглых скобок вокруг одного из аргументов:
// +--------- Note extra parentheses!! ---------+
// | |
// V V
std::vector<float> results((std::istream_iterator<int>(actualLineStream)),
std::istream_iterator<int>());
Или просто объявить каждый итератор отдельно:
std::istream_iterator<int> resultsBegin(actualLineStream);
std::istream_iterator<int> resultsEnd;
std::vector<float> results(resultsBegin, resultsEnd);