Мне нужен отложенный вызов некоторой функции с аргументами. Есть следующий тестовый код:Связать с одним вызовом копии ctor
#include <functional>
#include <boost/bind.hpp>
#include <boost/function.hpp>
struct test
{
test()
{
std::cout << "ctor" << std::endl;
}
test& operator=(test const& t)
{
std::cout << "operator=" << std::endl;
return *this;
}
test(test const& t)
{
std::cout << "copy ctor" << std::endl;
}
~test()
{
std::cout << "dtor" << std::endl;
}
};
int foo(test const & t)
{
return 0;
}
int main()
{
test t;
boost::function<int()> f = boost::bind(foo, t);
f();
return 0;
}
Выход:
ctor
copy ctor
copy ctor
copy ctor
copy ctor
dtor
copy ctor
dtor
dtor
copy ctor
copy ctor
copy ctor
copy ctor
copy ctor
copy ctor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
Таким образом, мы можем увидеть, что копия называется т е р в 11 раз !!!
Хорошо. Изменение подталкивание :: привязка к станд :: безвыходном:
int main()
{
test t;
boost::function<int()> f = std::bind(foo, t);
f();
return 0;
}
Выход:
ctor
copy ctor
copy ctor
copy ctor
dtor
copy ctor
copy ctor
copy ctor
copy ctor
copy ctor
copy ctor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
Копия т е р называется 9 раз. ОК. Если change boost :: function to std :: function copy ctor будет вызываться только 4 раза. Но это тоже плохое поведение.
Возможно ли это сделать с 1-го вызова копии ctor? std :: ref - плохая идея, потому что он может ссылаться в другой теме и т. д.
Извините за мой плохой английский :) Спасибо.
Да, режим выпуска и -O2. std :: move возможен в некоторых случаях. – Max
В MinGW с GCC 4.4 У меня есть ошибка: ожидаемое первичное выражение перед '[' токеном на std :: function f = [=]() {foo (t); }; :( –
Max
GCC 4.4 не поддерживает lambdas, но вы отметили C++ 0x, поэтому я ожидал, что у вас есть поддержка лямбда. – Puppy