过去http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.19
我遇到了这个问题我的问题是,写作时
Foo x(Bar());
为什么“声明一个返回Bar对象的非成员函数”?如果我写了
,我能理解Foo x(Bar);
但它认为()在Bar()中意味着什么?
答案 0 :(得分:5)
Bar()
表示“一个不带参数的函数并返回Bar
”。考虑一下这样一个函数的声明:
Bar GetBar();
如果从中删除函数的名称,剩下的将描述函数类型。它使用的一些例子是模板参数;例如你可以这样写:
std::function<int(float)> f1;
std::function<Bar()> f2;
希望这能解释一般的语法。现在这意味着在这种特殊情况下。当函数类型用作函数类型的参数时,它会自动为函数指针类型取代。因此,等效(但更清晰)的声明将是:
Foo x(Bar(*)());
答案 1 :(得分:3)
考虑以下更简单的例子:
void fn1(int a)
{
}
fn1是一个带有单个int参数的函数。
现在看看fn2:
//Same as typing void fn2(int (*b)())
void fn2(int b())
{
}
这里fn2不接受int,但它接受一个返回int的函数。
现在,如果您想声明fn1,可以这样输入:
void fn1(int);//ommit the parameter name
你也可以这样声明fn2:
void fn2(int());
使用示例:
#include <iostream>
int a()
{
sd::cout<<"hi"<<std::endl;
return 0;
}
void fn2(int b())
{
b();
}
int main(int argc, char **argv)
{
fn1(3);
fn2(a);
}
输出将是:
喜
现在还有一个要理解的主题......您可以使用范围转发声明函数。
a.cpp:
void a()
{
void c();
c();
}
//void b()
//{
// c();//<--- undeclared identifier
//}
int main(int argc, char**argv)
{
a();
return 0;
}
c.cpp
#include <iostream>
void c()
{
std::cout<<"called me"<<std::endl;
}
g ++ a.cpp c.cpp ./a.out
输出将是:
打电话给我
把它们捆绑在一起。如果你这样做:
int main(int argc, char**argv)
{
int b();
return 0;
}
您正在声明一个名为b()的函数,它返回int类型并且不带参数
如果你做b = 3;然后你会得到一个编译错误,因为你不能为前向声明的函数赋值。
一旦你读完所有内容就会变得清晰:
Foo x(Bar());
您正在声明一个函数x,它返回一个类型Foo并将一个参数输入到一个返回类型Bar的函数。
答案 2 :(得分:0)
不幸的是,它似乎并不在线,但Scott Meyers的书Effective STL对你的例子中的内容有一个很好的详细解释第6项:警惕C ++最烦恼的解析。
从好的方面来说,这本书对于认真对待C ++的人来说是物有所值。