Самый неприятный анализ
Это связано с тем, что известно как «самый неприятный синтаксический анализ C ++». По сути, все, что может быть интерпретировано компилятором как объявление функции, будет интерпретировано как объявление функции.
Еще один пример той же проблемы:
std::ifstream ifs("file.txt");
std::vector<T> v(std::istream_iterator<T>(ifs), std::istream_iterator<T>());
v
интерпретируется как объявление функции с 2 параметрами.
Обходной путь - добавить еще пару скобок:
std::vector<T> v((std::istream_iterator<T>(ifs)), std::istream_iterator<T>());
Или, если у вас есть C ++ 11 и инициализация списка (также известная как равномерная инициализация):
std::vector<T> v{std::istream_iterator<T>{ifs}, std::istream_iterator<T>{}};
При этом никоим образом это не может быть интерпретировано как объявление функции.