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()添加到移动构造函数并移动运算符,但这不起作用。谢谢你
答案 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构造函数。