编译错误:boost::p romise<T>::set_value(const T&) 不存在

Compile error: boost::promise<T>::set_value(const T&) doesn't exist

本文关键字:value const 不存在 set gt boost romise lt 编译 错误      更新时间:2023-10-16

我的Boost有问题。线程的未来:除了基本类型之外,我似乎不能将任何东西放入承诺、未来或打包的任务中。

下面是一个最小的测试用例:

#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之前定义的BOOST_THREAD_USES_MOVE。我在gcc 4.8.2和Boost 1.55(这里的完整输出)中得到以下错误:

../../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()的重载。看看future.hpp中的promisefuture_traits,似乎只有在BOOST_NO_CXX11_RVALUE_REFERENCES未定义时才会存在const左值ref重载。然而,这对我来说毫无意义……当没有右值引用时,确实需要const左值ref重载吗?(注意,即使我传递一个可变左值ref给make_ready_future(),也会发生这种情况)。

如果我没有定义BOOST_THREAD_USES_MOVE,它会编译失败,并出现以下错误(这里是完整的输出):

../../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()
                                                     ^
我错过什么了吗?

从Boost用户的邮件列表来看,这似乎是Boost中的一个错误,并且在1.56中也存在-看起来它在c++ 03模式中从根本上被破坏了。

Bug报告:https://svn.boost.org/trac/boost/ticket/10340