25

boost::optionalメンバー変数を持つクラスでデフォルトの移動コンストラクターを定義しようとしています。

#include <boost/optional.hpp>
#include <utility>
#include <vector>

struct bar {std::vector<int> vec;};

struct foo {
  foo() = default;
  foo(foo&&) = default;
  boost::optional<bar> hello;
};

int main() {
  foo a;
  foo b(std::move(a));
}

私のコンパイラは移動セマンティクスとデフォルトの移動コンストラクタの両方をサポートしていますが、これを機能させることができません。

% clang++ foo.cc -std=c++11 -stdlib=libc++
foo.cc:15:7: error: call to deleted constructor of 'foo'
  foo b(std::move(a));
      ^ ~~~~~~~~~~~~
foo.cc:9:3: note: function has been explicitly marked deleted here
  foo(foo&&) = default;
  ^
1 error generated.

Boost のソース コードを変更boost::optional せずに a を移動する方法はありますか? それとも、ブーストが移動をサポートするまで待つべきですか?

私は過去に同じ問題を抱えていboost::anyました。

4

3 に答える 3

22

Boost.Optional は、Boost バージョン 1.56 以降でのみムーブ コンストラクションをサポートします。リリース ノートを参照してください。

于 2014-09-22T15:20:47.783 に答える
18

ソース コードを見るとboost::optional、ムーブ コンストラクターやムーブ割り当てが定義されていません。ただし、コピー コンストラクターと代入は定義されているため、コンパイラーはムーブ コンストラクターとその代入を自動生成できません。

Move コンストラクターを参照してください— Q&A :

コンパイラは、明示的にコピー コンストラクター、コピー/移動代入、またはデストラクタを定義していない限り、移動コンストラクターをメンバー単位の移動として暗黙的に生成します。

リュック・ダントンが示唆するように、その治療法が必要です。空の作成が安価であることを期待しswapて移動するために使用してみましょう。次に、デフォルトで構築されたものを r-value のものと交換します。boost::optionalboost::optionalboost::optionalfoo

foo(foo&& b) {
    hello.swap(b.hello);
}

移動の割り当てについても同じです。

于 2012-05-28T11:08:04.417 に答える
3

boost::optional に対する C++11 機能のサポートが議題のどれだけ高いかは明らかではありません。

私はインターネット上で素敵な仲間を見つけました.Boostライセンスの下で彼自身のコードのいくつかを私に与えてくれました...まだいくつかの調整が行われています. それは私にとってうまくいくポイントにあります。たぶん、この質問を見ている人に役立つでしょう:

https://github.com/hostilefork/CopyMoveConstrainedOptional

進行中の を定義するためのより大きなグループの取り組みもありますstd::optional...しかし、彼らの参照実装は、私が持っていたいくつかのケースを処理できませんでした:

http://kojot.sggw.waw.pl/~akrzemi1/optional/tr2.optional.proposal.html

于 2012-10-05T00:36:33.833 に答える