【问题标题】:boost::factory and std::functionboost::factory 和 std::function
【发布时间】:2013-11-04 23:31:51
【问题描述】:

我正在尝试在 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&lt;S*&gt;) (int)’

有趣的是,如果S 不接受任何参数,std::function&lt;S*()&gt; 会毫无怨言地分配给boost::factory。为什么这不起作用?是否有解决方法允许将boost::factory 分配给std::function?我正在使用 Boost.1.53

【问题讨论】:

    标签: c++ gcc boost std-function


    【解决方案1】:

    似乎boost::factory&lt;S*&gt; 坚持将其参数绑定到引用:

    boost::factory<S*> factory;
    
    factory(17); // error
    
    int argument(17);
    factory(argument); // OK
    

    基于此,boost::function&lt;S*(int)&gt; 似乎将参数作为int 传递而没有完美转发,而std::function&lt;S*(int)&gt; 似乎对参数使用完美转发。因此,参数不能绑定到boost::factory&lt;S*&gt; 参数。

    当使用gccstd::function&lt;...&gt; 通过const&amp; 传递参数时有效:

    std::function<S*(int const&)> factory = boost::factory<S*>();
    

    不幸的是,同样的解决方法不适用于 libc++ 中的 std::function&lt;...&gt;。既然您说您尝试使用 gcc 编译代码,这可能不是什么大问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多