Понимание компилятора C++
Возможный дубликат:
Самый неприятный разбор: почему не A a (()); Работа?
У меня возникла эта простая проблема C++, которая заставляет меня снова и снова пытаться возобновить степень CS, пытаясь что-то выучить на этот раз.;)
Почему этот код не компилируется:
vector<int> v(int());
v.push_back(1);
в то время как этот другой компилируется без единого предупреждения
vector<int> v((int()));
v.push_back(1);
Даже сложно вообще найти разницу (добавлены дополнительные скобки:P).
2 ответа
Это называется самый неприятный анализ.
vector<int> v(int());
Объявляет функцию v
который принимает функцию (без параметров, возвращающих int
) и возвращает vector<int>
, Это автоматически "настраивается" на функцию v
который принимает указатель на функцию (без параметров, возвращающих int
) и возвращает vector<int>
,
Дополнительная пара скобок запрещает эту интерпретацию, поскольку вы не можете поместить дополнительные скобки вокруг объявлений параметров в объявлениях функций, так (int())
может интерпретироваться только как инициализатор для объекта с именем v
,
C++ имеет явное правило устранения неоднозначности, которое предпочитает анализировать вещи (в данном случае int()
) в качестве деклараторов, а не выражений, если это имеет синтаксический (но не обязательно семантический) смысл.
Действительно, это объявление функции. Смотрите: http://www.gotw.ca/gotw/075.htm