Boost::variant は 1_54 で壊れていると思います。ブーストバリアントの境界型として std::unique_ptr を使用しようとしています。
1_54 のドキュメントによると、バリアントはコピー構築可能またはムーブ構築可能である必要があります。
http://www.boost.org/doc/libs/1_54_0/doc/html/variant/reference.html
そこで、移動コンストラクターを実装し、コードでコピー コンストラクターを無効にしました。
バリアント オブジェクトに何かを割り当てようとすると、コンパイルに失敗します。std::move を使用してバリアント オブジェクトにデータを割り当てるなど、さまざまなことを試しましたが、何も機能していないようです。コンパイル エラー スタック トレースに続いて、rhs データをバックアップしようとしている variant.hpp に問題があると判断しました。みなさんの考えを知りたいのですが、ブーストバリアントのドキュメントが間違っていると仮定するのが正しいかどうか教えてください.
前もって感謝します。
vs2010 でコンパイルし、C++11 を使用しています。
ここに私のテストコードがあります:
#include <iostream>
#include <memory>
#include <utility>
#include <vector>
#include <string>
#pragma warning (push)
#pragma warning (disable: 4127 4244 4265 4503 4512 4640 6011)
#include <boost/optional.hpp>
#include <boost/variant.hpp>
#include <boost/ref.hpp>
#include <boost/shared_ptr.hpp>
#pragma warning (pop)
#include <boost/foreach.hpp>
#include <boost/format.hpp>
using boost::format;
using boost::str;
using namespace std;
class UniqueTest
{
};
class Foo
{
public:
std::unique_ptr<UniqueTest> testUniquePtr;
Foo() { std::cout << "Foo::Foo\n"; }
Foo (Foo&& moveData)
{
}
Foo& operator=(Foo&& moveData)
{
return *this;
}
private:
Foo(Foo& tt);
Foo& operator=(const Foo& tt);
};
int main()
{
Foo x = Foo();
boost::variant<std::wstring,Foo> m_result2;
std::wstring testString = L"asdf";
m_result2 = testString; //Fails
//m_result2 = std::move(testString); //Fails
//m_result2 = std::move(x); //Fails
boost::get<Foo>(m_result2).testUniquePtr.get ();
return 0;
}