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 优雅地允许它)
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 优雅地允许它)