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

ath*_*hos 12 c++

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

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

Foo f(Bar());
Run Code Online (Sandbox Code Playgroud)

答案:它可能是一个函数的声明,它接受类型Bar并返回类型Foo,或者它是f一个类型的定义Foo,它有一个类型为Bar的构造函数.问题是两者的语法是相同的,所以为了解决这个问题,C++标准规定编译器必须更喜欢函数声明,而不能对它进行区分.

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

Dav*_*vid 11

该函数f实际上将函数指针指向一个不带参数的函数,并给出一个Bar.参数的类型fBar (*)().

此代码无法编译(我们可以在错误消息中看到参数的实际类型):

class Foo { };
class Bar { };

Foo f(Bar());

int main() {
  Bar b;
  f(b);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码确实编译:

class Foo { };
class Bar { };

Foo f(Bar());

Bar g();

int main() {
  f(g);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

正如你在问题中所说的,它可能具有的第二个含义是你正在调用一个新Foo对象,f并且你正在调用构造函数Bar()(一个新的实例Bar).它类似于:

Foo f = Foo(Bar());
Run Code Online (Sandbox Code Playgroud)

Foo f(Bar());但是,在这种情况下,编译器会选择第一种解释.

有点混乱,如果你添加另一组括号,如

Foo f((Bar()));
Run Code Online (Sandbox Code Playgroud)

编译器选择第二种解释.

  • @athos**所有**C++标准兼容编译器必须.正如您所述:*"C++标准声明编译器必须优先选择函数声明来定义无法区分的对象定义."* (2认同)