boost::factory и std::function
Я пытаюсь преобразовать код в C++11 на GCC 4.7.2. Часть кода включала присвоение boost::factory
к boost::function
, Однако компиляция завершается с большим количеством предупреждений, если я изменю ее на std::function
, Вот пример кода, который воспроизводит ошибку:
#include <boost/functional/factory.hpp>
#include <boost/function.hpp>
#include <functional>
struct S {
S(int) {}
};
int main() {
boost::function<S*(int)> b = boost::factory<S*>(); // ok
std::function<S*(int)> s = boost::factory<S*>(); // error
}
Это дает error: no match for call to ‘(boost::factory<S*>) (int)’
Интересно, если S
не принимает аргументов, std::function<S*()>
присваивает boost::factory
без жалоб. Почему это не работает? Есть ли способ, позволяющий назначить boost::factory
для std::function
? Я использую Boost.1.53
1 ответ
Кажется, что boost::factory<S*>
настаивает на своем аргументе, чтобы быть привязанным к ссылке:
boost::factory<S*> factory;
factory(17); // error
int argument(17);
factory(argument); // OK
Исходя из этого, кажется, что boost::function<S*(int)>
передает аргумент как int
без идеальной пересылки в то время как std::function<S*(int)>
кажется, использует идеальную переадресацию на аргумент. В результате аргумент не может быть привязан к boost::factory<S*>
аргумент.
При использовании gccstd::function<...>
передавая аргумент const&
работает:
std::function<S*(int const&)> factory = boost::factory<S*>();
К сожалению, тот же обходной путь не работает с std::function<...>
из libC++. Поскольку вы сказали, что пытались скомпилировать код с помощью gcc, это может не составить особой проблемы.