我遇到了这个C ++问题:
问题:以下是定义或声明吗?
Foo f(Bar());
答案:它可能是一个函数的声明,它接受类型Bar并返回类型Foo,或者它是f
的定义作为类型Foo
,它有一个类型为Bar的构造函数。问题是两者的语法是相同的,所以为了解决这个问题,C ++标准规定编译器必须优先选择函数声明来定义无法区分的对象定义。
- 我不明白为什么它可以是“一个带有类型Bar并返回类型Foo的函数的声明”?如何在参数列表中出现括号“()”?
答案 0 :(得分:11)
函数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()
调用构造函数(a Bar
)的新实例。它类似于:
Foo f = Foo(Bar());
在Foo f(Bar());
的这种情况下,编译器会选择第一种解释。
有些令人困惑,如果你添加另一组括号,如
Foo f((Bar()));
编译器选择第二种解释。