C ++ Lite问题10.19。函数而不是变量decl

时间:2009-07-31 23:22:37

标签: c++ constructor

过去http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.19

我遇到了这个问题

我的问题是,写作时

Foo x(Bar());

为什么“声明一个返回Bar对象的非成员函数”?如果我写了

,我能理解
Foo x(Bar);

但它认为()在Bar()中意味着什么?

3 个答案:

答案 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 ++的人来说是物有所值。