Почему "boost::function = boost::bind(...)" создает 13 временных?

У меня есть довольно простой тестовый код. У меня есть класс, который просто записывает все операции над ним. Я связал это с boost::function объект как это:

    void Function(const Foo&)
    {
        printf("Function invoked\n");
    }

    // ...

    boost::function<void(void)> func;
    {
        Foo f;
        printf("\nConstructing function\n");
        func = boost::bind(&Function, f);
        printf("Construction complete\n\n");
    }

Я ожидаю, что объект функции содержит копию f, Поэтому создание хотя бы одной копии обязательно. Тем не менее, я считаю, что я получаю 13 временных. Выход:

Constructing function
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::Foo(const Foo&)
Foo::~Foo
Foo::~Foo
Foo::~Foo
Foo::~Foo
Construction complete

Я не могу использовать ref или же cref потому что мне нужно сделать копию объекта. Я делаю что-то ужасно неправильно? Или мне нужно использовать обертку (как boost::shared_ptr) чтобы избежать абсурдного количества копий?

Полный код и демонстрацию проблемы можно найти на Codepad.

1 ответ

Решение

Если вы удалите часть назначения "func = ", количество копий уменьшится до 4, что намного лучше, чем 13.

template <class F>
void callF(F fun)
{
}
callF(boost::bind(&func, fl));

Так что решение простое - не используйте boost::function

Другие вопросы по тегам