почему
Поскольку в стандарте более или менее сказано, что все, что может быть интерпретировано как объявление функции, будет в любом контексте не зависимо от того, что.
что за аргументы ...
Вы можете не верить этому, но это правда.input(cin)
трактуется как input cin
;в этом месте круглые скобки разрешены и просто бессмысленны.Однако input()
не считается объявлением параметра типа input
без имени;вместо этого это параметр типа input(*)()
, то есть указатель на функцию, не принимающую аргументов и возвращающую input
.Часть (*), по-видимому, не нужна для объявления типа.Я думаю, по той же причине, что &
является необязательным, когда вы используете имя функции для инициализации указателя функции ...
Другой способ обойти это, используя тот факт, что мы объявляемв любом случае значения отдельно, чтобы оправдать пропуск typedef:
istream_iterator<int> start(cin), end;
vector<int> v(start, end);
Другим способом является добавление скобок способом, который не разрешен для объявлений функций:
vector<int> v((input(cin)), input());
Для получения дополнительной информации,Google "c ++ самый неприятный анализ".