Ответ 1
Это правильное поведение.
std::bind
нуждается в этой непринужденности, чтобы соответствовать ее собственной спецификации.
Рассмотрим std::placeholders
, который используется для отметки параметров, которые передаются связанной функции.
using std::placeholders;
std::function<void(int)> f2 = std::bind( F, _1 );
// Parameter 1 is passed to ^^
// the bound function.
f2(7); // The int 7 is passed on to F
Аналогично, для второго параметра _2
, _3
для третьего и т.д.
Это вызывает интересный вопрос. Как должен вести себя этот объект функции?
auto f3 = std::bind( F, _3 );
Как вы можете себе представить, он следует своему собственному обещанию передать третий параметр в F. Это означает, что он ничего не делает для первых двух параметров.
f3(10, 20, 30); // The int 30 is passed on to F. The rest? Ignored.
Итак, это ожидаемое поведение и, возможно, единственная "функция", которая std::bind
выполняется над lambdas, даже в С++ 14.
Объект, созданный std::bind
, предназначен для принятия и игнорирования любых посторонних параметров.