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

我理解std::tr1::reference_wrapper<int>,这整件事是某种返回voidint&作为参数的函数指针。但我似乎无法在一开始就遵循*()。该代码是从我不久前经历的某个 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

1 回答 1

4

这是一个std::tr1::_Bind在函数类型上实例化的实例,该函数采用 astd::tr1::reference_wrapper<int>并返回指向函数的指针,该函数采用对 int 的引用并返回 void。

以下是如何阅读它:

  • std::tr1::_Bind<类型>应该清楚。
  • type = void (fn)(int&)是一个接受int&和返回的函数void
  • fn = *ptr所以它实际上是一个指向函数的指针
  • ptr = (fn2)(std::tr1::reference_wrapper<int>)是一个函数std::tr1::reference_wrapper<int>,到目前为止我们所拥有的是它的返回类型。
  • fn2 = (empty) 因为我们没有给该函数(类型)命名。

但是,正如我现在注意到的那样,当fn2为空时,它周围的括号可能也不应该存在(类似于您将函数类型“函数不带参数并返回 void”编写为void(), not void()().

中的情况std::tr1::function正是这样:一个不带参数并返回的函数void,在空的“函数名”周围有额外的括号。

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

因此,在 C++ 中编写第一种类型的正确方法是:

std::tr1::_Bind<void (*(std::tr1::reference_wrapper<int>))(int&)>
于 2012-04-15T19:46:06.280 回答