Это правильное поведение.
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
Аналогично, для второго параметра _3
для [3] имеется _2
и т. д.
Это вызывает интересный вопрос. Как должен функционировать этот объект функции?
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, даже в C ++ 14 и C ++ 17.
Объект, созданный std::bind
предназначен для принятия и игнорирования любых посторонних параметров.