Почему может Повышение. Связать функцию быть названными с дополнительными параметрами?

#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);
}

Когда выполнено, это распечатывает, "Эй: утконос". Это, кажется, полностью игнорирует дополнительные параметры. Я ожидал бы получать ошибку компиляции. Я случайно ввел ошибку в свой код этот путь.

7
задан Rob Kennedy 23 July 2010 в 18:26
поделиться

2 ответа

Я не знаю, почему это разрешено, но я знаю, что это ожидаемое поведение. Из здесь:

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) не содержит ссылок на какие-либо аргументы, кроме первого, но он все равно может быть использован с более чем одним аргументом. Любые дополнительные аргументы игнорируются (выделено мной), так же как и как первый и второй аргументы игнорируются в третьем примере.

2
ответ дан 7 December 2019 в 18:39
поделиться

Готов поспорить, это создает связанную функцию как функцию с переменными числами, например printf .

0
ответ дан 7 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: