c – 为什么“Foo f(Bar());”可以是一个函数的声明,它接受类型B
发布时间:2020-12-16 07:49:46 所属栏目:百科 来源:网络整理
导读:参见英文答案 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())); 编译器选择第二个解释. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |