boost::variant 和 moveconstructible

boost::variant and moveconstructible

boost::variant 1.57 规范说:

The requirements on a bounded type are as follows: CopyConstructible or 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();
}

error C2248: 'A::A' : cannot access private member declared in class 'A'

是因为 MSVC2012 编译器缺乏对 C++11 的适当支持,还是 boost::variant 错误?

如果是 MSVC2012 的问题,那么您知道任何解决方法吗?

更新

在我的简短示例中,缺少移动赋值运算符。我更新了示例。

将 throw() 添加到默认构造函数解决了这个问题。以前我尝试将 throw() 添加到移动构造函数和移动运算符中,但这没有用。谢谢 sehe

testVariant = A();

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

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

这一行应该如您所愿。

如果定义了移动赋值运算符并且使用 noexcept 声明了移动或默认构造函数,您的代码将使用 clang 和 gcc 进行编译。

据我所知,您还需要移动分配。

并使默认构造函数 noexcept:

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

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

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