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

私は理解しています。これはすべて、引数としてstd::tr1::reference_wrapper<int>返して受け取るある種の関数ポインターです。しかし、最初の*()をたどることができないようです。コードは、私がしばらく前に行っていた gdb セッションから切り貼りされたものです。voidint&

また、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

これは、aを取り、intへの参照を取り、voidを返す関数へのポインタを返すstd::tr1::_Bind関数の型でインスタンス化されたインスタンスです。std::tr1::reference_wrapper<int>

読み方は次のとおりです。

  • std::tr1::_Bind<タイプ>は明確でなければなりません。
  • type = 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はまさにその1つです。パラメータを受け取らずvoidに、空の「関数名」を括弧で囲んで返す関数です。

OK、今それをテストしました:gdbは確かに;として出力void()します。void()()これはおそらくgdbのバグと見なされるべきです。

したがって、C++で最初の型を記述する正しい方法は次のとおりです。

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