2012-04-15 84 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