2012-03-23 61 views
2

請解釋一下,爲什麼在下面的代碼沒有錯誤不同的簽名:的std ::綁定和調用的函數綁定

void f() 
{ 
} 

void h() 
{ 
    std::bind(f)(42); 
} 

爲什麼編譯器不會抱怨STD冗餘參數::綁定,而綁定函數f?如果不應該,請解釋爲什麼這可能有用。

+2

您正在使用什麼編譯器?知道有人試圖回答這個問題可能很有用。 – 2012-03-23 23:32:24

+0

不是嗎? g ++抱怨並且不會編譯... – ShinTakezou 2012-03-24 01:15:42

回答

2

此代碼是符合的。您傳遞給綁定結果的參數僅在需要時使用。


使用從標準的術語:ustd::bind(f, t1, ..., tN)結果。

講:

u(u1, u2, ..., uM)被調用時,f稱爲f(v1, ..., vN),其中vi值由下面的算法確定:

//N is the N from `std::bind(f, t1, ..., tN)` 
For each i in 1 to N: 
    if (ti is a reference wrapper) vi is the unwrapped version of t1 
    if (ti is a bind_expression) vi is the result of calling ti with u1, ..., uM 
    if (ti is a placeholder) vi is uj (where j is is_placeholder<decltype(ti)>::value) 
    otherwise vi is ti