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

参见英文答案 > Most vexing parse: why doesn’t A a(()); work?5个
我遇到这个C题:

问题:以下是定义还是声明?

Foo f(Bar());

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

– 我不明白为什么它可以是“一个函数的声明,接受类型Bar并返回类型Foo”?怎么来一个括号“()”出现在参数列表中?

解决方法

函数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;
}

正如您在问题中所说的那样,它可以具有的第二个含义是,您正在创建一个名为f的新Foo对象,您正在使用Bar()(Bar的新实例)调用构造函数.这将类似于:

Foo f = Foo(Bar());

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

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

Foo f((Bar()));

编译器选择第二个解释.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...