Foo f2();
объявляет функцию с именем f2
, которая не принимает аргументов и возвращает объект типа Foo
Также рассмотрим случай, когда у вас также есть конструктор копирования внутри Foo
Foo (const Foo& obj)
{
cout << "Copy c-tor Foo()" << endl;
}
Если вы попытаетесь написать Foo obj(Foo())
, в этом случае вы, вероятно, ожидаете вызова к копирующему c-tor, который будет неправильным.
В этом случае obj
будет проанализирован как функция, возвращающая объект Foo и принимающая аргумент типа указатель на функцию. Это также известно как Most Vexing Parse .
Как упомянуто в одном из комментариев Foo obj((Foo()));
заставит компилятор анализировать его как выражение (т.е. интерпретировать как объект), а не как функцию из-за дополнительного ()
.