std :: bind и другая подпись вызывающей связанной функции - PullRequest
2 голосов
/ 24 марта 2012

Пожалуйста, объясните, почему в следующем коде нет ошибки:

void f()
{
}

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

Почему компилятор не жалуется на избыточный параметр в std :: bind при привязке функции f?А если это не так, пожалуйста, объясните, почему это может быть полезно.

1 Ответ

2 голосов
/ 24 марта 2012

Этот код соответствует.Аргументы, которые вы передаете результату связывания, используются только при необходимости.


Использование терминологии из стандарта: u - это результат std::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
...