Подтвердить что ты не робот

Почему "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.

4b9b3361

Ответ 1

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

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

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