Понимание компилятора 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

Другие вопросы по тегам