Почему функция Boost.Bind может быть вызвана с дополнительными параметрами? - PullRequest
7 голосов
/ 23 июля 2010
#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);
}

При запуске выдается «Yo: Утконос». Похоже, полностью игнорировать дополнительные параметры. Я ожидаю получить ошибку компиляции. Я случайно ввел ошибку в свой код таким образом.

Ответы [ 2 ]

2 голосов
/ 24 июля 2010

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

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

0 голосов
/ 23 июля 2010

Бьюсь об заклад, он создает связанную функцию в виде переменной функции, как printf.

...