提升移动编译错误

时间:2017-05-16 04:22:50

标签: c++ boost move

我试图在类体外部实现移动构造函数,但它不能正确编译

#include <boost/move/move.hpp>

class Test
{
    BOOST_COPYABLE_AND_MOVABLE(Test)
public:
    Test() {}
    Test(const Test & other) { }
    Test(BOOST_RV_REF(Test) other);
    Test & operator=(BOOST_COPY_ASSIGN_REF(Test) other) { return *this; } 
    Test & operator=(BOOST_RV_REF(Test) other) { return *this; }
};

Test::Test(BOOST_RV_REF(Test) other) { }

我用g ++编译了这段代码,我的g ++版本是4.4.7

$ g++ -c test.cpp
test.cpp:15: error: prototype for 'Test::Test(boost::rv<Test>&)' does not match any in class 'Test'
test.cpp:9: error: candidates are: Test::Test(boost:rv<Test>&)
test.cpp:8: error:                 Test::Test(const Test&)
test.cpp:7: error:                 Test::Test()

2 个答案:

答案 0 :(得分:0)

  

g ++ 5.4.0 - flyzero

也失败了

必须是你的助推版本。

它适用于g ++ 5.4.1和Boost 1.64。如果没有,请检查预处理器输出是否有任何包含/宏发生故障。

答案 1 :(得分:0)

在Linux中,使用may_alias属性声明 :: boost :: rv 。删除may_alias属性后,我的代码编译正确。

#define BOOST_MOVE_ATTRIBUTE_MAY_ALIAS __attribute__((__may_alias__))

template <class T>
class rv
    : public ::boost::move_detail::if_c
        < ::boost::move_detail::is_class<T>::value
        , T
        , ::boost::move_detail::nat
        >::type
{
    rv();
    ~rv() throw();
    rv(rv const&);
    void operator=(rv const&);
} BOOST_MOVE_ATTRIBUTE_MAY_ALIAS;