gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:18:23 24 4
gpt4 key购买 nike

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

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

Foo f(Bar());

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

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

最佳答案

函数f实际上接受一个函数指针,指向一个不带参数的函数,并给出一个Barf 的参数类型是 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 f(Bar()); 的情况下,第一个解释是由编译器选择的。

有点令人困惑,如果你添加另一组括号,如

Foo f((Bar()));

编译器选择第二种解释。

关于c++ - 为什么 "Foo f(Bar());"可以是一个接受类型 Bar 并返回类型 Foo 的函数的声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27613904/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com