Конструктор вектора с двумя параметрами анализируется как объявление функции

Рассмотрим этот пример:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

int main()
{
    std::string sen = "abc def ghi jkl";
    std::istringstream iss(sen);

    std::vector<std::string>    // declaration in question
    vec(std::istream_iterator<std::string>(iss),
        std::istream_iterator<std::string>());

    std::copy(vec.begin(), vec.end(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
}

Компилятор выдает ошибку при вызове запроса std :: copy

для члена 'begin' в 'vec', который не является -class type ...

Я могу обойти ошибку следующим образом:

std::istream_iterator<std::string> it_begin(iss);
std::istream_iterator<std::string> it_end;
std::vector<std::string> vec(it_begin, it_end);

или заключив каждый параметр в круглые скобки, например:

std::vector<std::string>
vec((std::istream_iterator<std::string>(iss)),
    (std::istream_iterator<std::string>()));

или даже с новой унифицированной инициализацией в C ++ 11:

std::vector<std::string> vec { /*begin*/, /*end*/ };

Почему компилятор анализирует объявление в примере как объявление функции? Я знаю о наиболее неприятном синтаксическом анализе, но я думал, что это происходит только с пустыми списками параметров. Мне также интересно, почему работает второй способ обхода.

5
задан AProgrammer 24 January 2012 в 14:05
поделиться