Я не думаю, что в этом случае применяется правило «если это может быть декларация, то она считается декларацией». Так как в следующем, обе вещи являются объявлениями
string a;
string a();
Один - это объявление объекта, а другой - объявление функции. Правило применяется в других случаях. Например, в этом случае:
string a(string());
В этом случае string()
может означать две вещи.
- Объявление неназванного параметра функции
- Выражение создания созданного по умолчанию
string
Здесь применяется fule, и string()
означает то же самое, что и следующий именованный параметр (имена не имеют значения в параметрах при объявлении функции)
string a(string im_not_relevant());
Если функция принимает в качестве параметра массив или другую функцию, этот параметр превращается в указатель. В случае параметра функции указатель на функцию. Таким образом, это эквивалентно следующему, которое может выглядеть более знакомым
string a(string (*im_not_relevant)());
Но в вашем случае это скорее синтаксис, который мешает. Это говорит о том, что следующее является объявлением функции. Это никогда не может быть объявлением объекта (хотя это, вероятно, было задумано программистом!)
string a();
Таким образом, в этом контексте нет никакой двусмысленности, и поэтому он объявляет функцию. Поскольку string
имеет определяемый пользователем конструктор, вы можете просто опустить скобки, и эффект останется таким же, как и предполагалось.