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

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

概述参见英文答案 > Most vexing parse: why doesn’t A a(()); work?                                    5个 我遇到这个C题: 问题:以下是定义还是声明? Foo f(Bar()); 答案:它可能是一个函数的声明,它接受类型Bar并返回类型Foo,或者它是一个F类型的定义,它具有一个构造函数,它带有类型Bar.问题是两者的 参见英文答案 > 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 – 为什么“Foo f(Bar());”可以是一个函数的声明,它接受类型Bar并返回类型Foo?全部内容,希望文章能够帮你解决c – 为什么“Foo f(Bar());”可以是一个函数的声明,它接受类型Bar并返回类型Foo?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1232718.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存