是否可以移动boost :: optional?

时间:2012-05-28 10:50:45

标签: c++ boost c++11 move-semantics boost-optional

我一直在尝试使用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::optional 而不用修改Boost的源代码?或者我应该等到Boost支持移动?

我过去曾遇到boost::any同样的问题。

3 个答案:

答案 0 :(得分:22)

Boost.Optional支持自Boost版本1.56起移动构造。请参阅the release notes

答案 1 :(得分:18)

查看boost::optional源代码,它不会定义移动构造函数或移动赋值。但是,它确实定义了复制构造函数和赋值,这会阻止编译器自动生成移动构造函数和赋值。

请参阅Move constructor — Q&A

  

编译器将隐式生成移动构造函数作为成员移动,除非您已明确定义了复制构造函数或复制/移动赋值或析构函数

正如Luc Danton所说,需要找到治疗方法。让我们尝试使用swap移动boost::optional,希望创建一个空boost::optional便宜,然后我们只需将默认构造的boost::optional与r-中的一个交换值foo,例如:

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

移动任务也一样。

答案 2 :(得分:3)

目前还不清楚C ++ 11功能对boost :: optional的支持程度有多高。

我在互联网上发现了一个很好的家伙,他在升级许可下给了我一些他自己的代码......这仍然在进行一些调整。它正处于适合我的地步。也许它会帮助任何人看这个问题:

https://github.com/hostilefork/CopyMoveConstrainedOptional

还有一个更大的小组努力来定义一直在进行的std::optional ......但是他们的参考实现无法处理我的一些案例:

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