2012-04-15 57 views
6
std::tr1::_Bind<void (*()(std::tr1::reference_wrapper<int>))(int&)> 

我明白std::tr1::reference_wrapper<int>,这整个事情是某种形式返回void,并采取int&作为参数的函数指针。但我似乎无法在开始时遵循*()。我从一些gdb会话中剪下来的代码正在经历一段时间。此模板中的类型是什么?

另外,tr1 :: function的类型是什么?一些函数返回void并且没有参数?

0x00000001000021a1 in std::tr1::function<void()()>::operator() (this=0x7fff5fbffb98) at functional_iterate.h:865 

但是再下面是一个错误:

template <typename T> 
void f() 
{ 
    cout << "general\n"; 
} 

template<> 
void f<void()()>() // this is error 
{ 
    cout << "specific\n"; 
} 

回答

4

这是实例化一个函数的服用std::tr1::reference_wrapper<int>和返回指针到一个函数取参考为int类型的std::tr1::_Bind一个实例并返回无效。

以下是如何阅读:

  • std::tr1::_Bind<>应该是清楚的。
  • 类型 = void (FN)(int&)是一个函数服用int&和返回void
  • FN = *PTR所以它实际上是一个函数指针
  • PTR = (FN2)(std::tr1::reference_wrapper<int>)正在std::tr1::reference_wrapper<int>的功能和我们有什么到现在为止它的返回类型。
  • fn2 =(空),因为我们不给这个函数(类型)一个名字。

然而,当FN2是空的,因为我现在发现,它周围的括号也许应该也不会在那里(类似于你如何写功能型“功能采取任何参数,并返回void”为void(), 。不void()()

std::tr1::function的情况下,正是一个:函数采取任何参数和返回void,与各地空“函数名”额外的括号

好了,现在测试了它:GDB确实输出void() as void()();这可能应该被认为是一个gdb的错误。

++写的第一输入C因此,正确的方法是:

std::tr1::_Bind<void (*(std::tr1::reference_wrapper<int>))(int&)> 
+0

应该不是明星是两个括号为之间? – 6502 2012-04-15 19:49:29

+0

@ 6502:不,因为星星属于函数的返回类型*(它本身就是一个函数,并且对于*函数,星形确实在对应的圆括号内)。 – celtschk 2012-04-15 19:59:22

+0

@ Fanatic23:我已经在写这篇文章了。它只是花了一些时间。 – celtschk 2012-04-15 20:00:22

相关问题