boost :: factory和std :: function

时间:2013-11-04 23:31:51

标签: c++ gcc boost std-function

我正在尝试在gcc 4.7.2上将一些代码转换为C ++ 11。部分代码包括将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 个答案:

答案 0 :(得分: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*>();

不幸的是,同样的解决方法不适用于libc ++中的std::function<...>。既然你说你试图用gcc编译代码,那可能不是什么大问题。