私は G++ 4.7 でブリーディング エッジのセットアップをまとめました (ただし、現時点ではsudo apt-get boost-all-dev
、Debian Wheezy に付属のブースト 1.48 をまだ使用しています)。
私のコードは、使用する論理データ構造がunique_ptrの多次元配列になる場所に設定されています。しかしmulti_array
、unique_ptr が含まれている場合、空の単一要素の配列でさえ構築できないようです。したがって、これは機能します:
boost::multi_array<int, 1> arrWorks (boost::extents[1]);
しかし、これはしません:
boost::multi_array< unique_ptr<int>, 1> arrFails (boost::extents[1]);
コンパイラからの関連する苦情は次のとおりだと思います。
/usr/include/c++/4.7/bits/stl_uninitialized.h:225: 'void std::uninitialized_fill_n(_ForwardIterator, _Size, const _Tp&) から必要 [with _ForwardIterator = std::unique_ptr*; _Size = unsigned int; _Tp = std::unique_ptr]'</p>
optional< unique_ptr<...> >
ここで提供されているパッチを適用しても、いくつかの問題があります。
https://svn.boost.org/trac/boost/ticket/1841
( 注: Is it possible to move a boost::optional? で見つかりました)
たとえば、次のようになります。
boost::optional< unique_ptr<int> > optWorks (new int);
// Fails
boost::optional< unique_ptr<int> > optFails (std::move(optWorks));
自分のしていることは合法だと感じています。実際、unique_ptr をこのプロジェクトに組み込むことで、所有権の譲渡のセマンティクスに関していくつかのバグを既に発見しています。だから私は「ああ、これは複雑すぎる、生のポインタを使うだけだ」と言いたくありません。
これはブーストの議題でサポートするものですか? タイムラインはありますか?当面の間、使用できる簡単な回避策はありますか?