我遇到了这个C++问题:
问题:以下是定义或声明吗?
Foo f(Bar());
Run Code Online (Sandbox Code Playgroud)
答案:它可能是一个函数的声明,它接受类型Bar并返回类型Foo,或者它是f一个类型的定义Foo,它有一个类型为Bar的构造函数.问题是两者的语法是相同的,所以为了解决这个问题,C++标准规定编译器必须更喜欢函数声明,而不能对它进行区分.
- 我不明白为什么它可以是"一个函数的声明,它采用类型Bar并返回类型Foo"?如何在参数列表中出现括号"()"?
Dav*_*vid 11
该函数f实际上将函数指针指向一个不带参数的函数,并给出一个Bar.参数的类型f是Bar (*)().
此代码无法编译(我们可以在错误消息中看到参数的实际类型):
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)
编译器选择第二种解释.
| 归档时间: |
|
| 查看次数: |
429 次 |
| 最近记录: |