Ответ 1
Функция f
фактически принимает указатель на функцию, которая не принимает аргументов и дает Bar
. Тип аргумента f
- Bar (*)()
.
Этот код не скомпилируется (и мы можем видеть фактический тип аргумента в сообщении об ошибке):
class Foo { };
class Bar { };
Foo f(Bar());
int main() {
Bar b;
f(b);
return 0;
}
Но этот код компилируется:
class Foo { };
class Bar { };
Foo f(Bar());
Bar g();
int main() {
f(g);
return 0;
}
Второе значение, которое может иметь, как вы говорите в вопросе, состоит в том, что вы создаете новый объект Foo
с именем f
, и вы вызываете конструктор с помощью Bar()
(новый экземпляр Bar
). Он будет похож на:
Foo f = Foo(Bar());
В этой ситуации Foo f(Bar());
, хотя первая интерпретация выбирается компилятором.
Несколько смутно, если вы добавите еще один набор скобок, как в
Foo f((Bar()));
компилятор выбирает вторую интерпретацию.