这个模板的类型是什么?

Fan*_*c23 6 c++ templates

std::tr1::_Bind<void (*()(std::tr1::reference_wrapper<int>))(int&)>
Run Code Online (Sandbox Code Playgroud)

我理解std::tr1::reference_wrapper<int>,这整个事情是某种函数指针返回voidint&作为参数.但我似乎无法在开始时遵循*().代码是从一些gdb会话中剪下来的,我经历了一段时间.

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

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

但接下来是一个错误:

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

template<>
void f<void ()()> () // this is error
{
  cout << "specific\n";
}
Run Code Online (Sandbox Code Playgroud)

cel*_*chk 4

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

阅读方法如下:

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

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

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

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

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

std::tr1::_Bind<void (*(std::tr1::reference_wrapper<int>))(int&)>
Run Code Online (Sandbox Code Playgroud)