为什么“Foo f(Bar());”可以是一个函数的声明,它接受类型Bar并返回类型Foo?

时间:2014-12-23 04:03:14

标签: c++

我遇到了这个C ++问题:

问题:以下是定义或声明吗?

Foo f(Bar());

答案:它可能是一个函数的声明,它接受类型Bar并返回类型Foo,或者它是f的定义作为类型Foo,它有一个类型为Bar的构造函数。问题是两者的语法是相同的,所以为了解决这个问题,C ++标准规定编译器必须优先选择函数声明来定义无法区分的对象定义。

- 我不明白为什么它可以是“一个带有类型Bar并返回类型Foo的函数的声明”?如何在参数列表中出现括号“()”?

1 个答案:

答案 0 :(得分:11)

函数f实际上是一个函数指针,指向一个不带参数的函数,并给出Barf的参数类型为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()调用构造函数(a Bar)的新实例。它类似于:

Foo f = Foo(Bar());

Foo f(Bar());的这种情况下,编译器会选择第一种解释。

有些令人困惑,如果你添加另一组括号,如

Foo f((Bar()));

编译器选择第二种解释。