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, это может не составить особой проблемы.

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