我正在尝试在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
答案 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*>
参数。
使用gcc的std::function<...>
通过const&
传递参数时起作用:
std::function<S*(int const&)> factory = boost::factory<S*>();
不幸的是,同样的解决方法不适用于libc ++中的std::function<...>
。既然你说你试图用gcc编译代码,那可能不是什么大问题。