#include <iostream>
#include <string>
#include <boost/bind.hpp>
void foo(std::string const& dummy)
{
std::cout << "Yo: " << dummy << std::endl;
}
int main()
{
int* test;
std::string bar("platypus");
(boost::bind(&foo, bar))(test, test, test, test, test, test, test, test);
}
Когда выполнено, это распечатывает, "Эй: утконос". Это, кажется, полностью игнорирует дополнительные параметры. Я ожидал бы получать ошибку компиляции. Я случайно ввел ошибку в свой код этот путь.
Я не знаю, почему это разрешено, но я знаю, что это ожидаемое поведение. Из здесь:
bind может обрабатывать функции с более чем чем двумя аргументами, и его механизм механизм подстановки является более общий:
bind(f, _2, _1)(x, y); // f(y, x) bind(g, _1, 9, _1)(x); // g(x, 9, x) bind(g, _3, _3, _3)(x, y, z); // g(z, z, z) bind(g, _1, _1, _1)(x, y, z); // g(x, x, x)
Обратите внимание, что в последнем примере объект функции объект функции, созданный bind(g, _1, _1, _1) не содержит ссылок на какие-либо аргументы, кроме первого, но он все равно может быть использован с более чем одним аргументом. Любые дополнительные аргументы игнорируются (выделено мной), так же как и как первый и второй аргументы игнорируются в третьем примере.
Готов поспорить, это создает связанную функцию как функцию с переменными числами, например printf
.