我遇到了Boost.Thread的未来问题:我似乎无法将任何原始类型放入承诺,未来或打包任务中。
这是一个最小的测试用例:
#include <boost/thread/future.hpp>
struct foo
{
foo(int i_): i(i_) {}
int i;
};
int main()
{
// A const future isn't much use, but I needed to prove
// the problem wasn't me trying to copy a unique_future
const boost::unique_future<foo>& fut = boost::make_ready_future( foo(42) );
}
在包含Boost.Future标头之前定义了BOOST_THREAD_USES_MOVE
我得到了gcc 4.8.2和Boost 1.55(完整输出here)的以下错误:
../../deps/boost/include/boost/thread/future.hpp:3634:5: error: no matching function for call to ‘boost::promise<foo>::set_value(const foo&)’
p.set_value(boost::forward<future_value_type>(value));
^
似乎没有带有const左值引用的promise :: set_value()的重载。查看promise
中的future_traits
和future.hpp
,似乎只有在BOOST_NO_CXX11_RVALUE_REFERENCES
未定义时才会存在const左值ref重载。然而,对我来说没有任何意义......当没有右值引用时,确实需要const lvalue ref重载吗? (注意,即使我将可变的左值ref传递给make_ready_future()
),也会发生这种情况。
如果我没有定义BOOST_THREAD_USES_MOVE
,则编译失败并出现以下错误(完整输出here):
../../deps/boost/include/boost/thread/detail/move.hpp:183:54: error: no matching function for call to boost::unique_future<foo>::unique_future(boost::unique_future<foo>)’
#define BOOST_THREAD_MAKE_RV_REF(RVALUE) RVALUE.move()
^
我错过了什么吗?
答案 0 :(得分:2)
似乎来自boost-users邮件列表,这是Boost中的一个错误,并且也出现在1.56中 - 看起来它在C ++ 03模式中从根本上被打破。