2012-03-23 12 views
2

bitte erklären, warum in den folgenden Code kein Fehler vorhanden ist:std :: bind und andere Signatur des Aufrufs binded Funktion

void f() 
{ 
} 

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

Warum Compiler beschwert sich nicht über redundante Parameter in std :: bind während Bindefunktion f? Und wenn es nicht sollte, erklären Sie bitte, warum das nützlich sein kann.

+2

Welche Compiler verwenden Sie? Es könnte nützlich sein, jemanden zu kennen, der versucht, die Frage zu beantworten. –

+0

nicht wahr? g ++ beschwert sich und wird nicht kompiliert ... – ShinTakezou

Antwort

2

Dieser Code ist konform. Die Argumente, die Sie an das Ergebnis der Bindung übergeben, werden nur bei Bedarf verwendet.


Unter Verwendung der Terminologie von der Norm: u ist das Ergebnis von std::bind(f, t1, ..., tN).

Ungefähr zu sprechen:

Wenn u(u1, u2, ..., uM) genannt wird, f als f(v1, ..., vN) genannt wird, wobei die Werte von vi durch den folgenden Algorithmus bestimmt:

//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 
Verwandte Themen