boost :: variant和moveconstructible

时间:2015-02-16 10:37:52

标签: c++ c++11 boost

boost :: variant 1.57规范说:

  

对有界类型的要求如下:   CopyConstructible或MoveConstructible。

但是代码不能在MSVC2012上编译。

#include <boost\variant.hpp>

struct A
{
    A(){}
    A(A&& other){}

    A operator=(A&& other){return *this;}

private:
    A(A const & other){} // MSVC2012 does not support deleted
};

int main() 
{
    boost::variant<A> testVariant;

    testVariant = A();
}
  

错误C2248:'A :: A':无法访问在类'A'

中声明的私有成员

是因为在MSVC2012编译器中缺少对C ++ 11的适当支持,还是它是一个boost :: variant bug?

如果MSVC2012出现问题,你知道有什么变通方法吗?

更新

在我的简短例子中,移动的分配操作员失踪了。我更新了这个例子。

将throw()添加到默认构造函数修复了问题。以前我试图将throw()添加到移动构造函数并移动运算符,但这不起作用。谢谢你

2 个答案:

答案 0 :(得分:2)

据我所知,你也需要移动任务。

并使默认构造函数为noexcept:

struct A
{
    A() noexcept {}
    A(A&&) {}
    A& operator=(A&&) {}

private:
    A(A const&){} // MSVC2012 does not support deleted
};

如果MSVC2012不支持noexcept(我相信它不支持),您可以尝试throw()(或者可以优先允许Boost)

答案 1 :(得分:0)

testVariant = A();

调用移动赋值运算符,因为已经创建了变量。

boost::variant<A> testVariant = A();

此行应该按预期工作。

如果定义了移动赋值运算符,则使用clang和gcc编译代码,并使用noexcept声明move或default构造函数。