Integer obj2()
- не определение объекта, это объявление функции с именем obj2
, возвращающей Integer
(поместите ее вне любой функции, чтобы понять, почему это так) Это происходит также иногда с более сложными конструкциями, где это может быть еще более запутанным. Некоторые называют это самым неприятным разбором .
Вот обещанный пример более сложного случая:
struct Foo {};
struct Bar { Bar(Foo); };
Bar quxx(Foo()); // quxx is a function
Здесь quxx
- это функция, которая возвращает Bar и принимает (указатель) на функцию, возвращающую Foo и без параметров. Вы можете написать ту же декларацию более четко, как это:
Bar quxx(Foo (*fn)()); // quxx is the same function as above
Чтобы получить определение переменной, инициализированной конструктором, принимающим Foo, вы можете добавить уровень скобок:
Bar quux((Foo())); // quux is a variable