是否可以移动boost :: optional?

25 c++ boost move-semantics c++11 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));
}
Run Code Online (Sandbox Code Playgroud)

我的编译器支持移动语义和默认的移动构造函数,但我不能让它工作.

% 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.
Run Code Online (Sandbox Code Playgroud)

有没有办法移动a boost::optional 而不修改Boost的源代码?或者我应该等到Boost支持移动?

我过去遇到了同样的问题boost::any.

And*_*zej 22

Boost.Optional支持自Boost版本1.56起移动构造.请参阅发行说明.


Max*_*kin 18

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

请参阅移动构造函数 - 问答:

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

正如吕克丹顿所暗示的那样,需要解决这个问题.让我们尝试使用swap,boost::optional希望创建一个空boost::optional便宜,然后我们只是将默认构造boost::optional与r值中的一个交换foo,例如:

foo(foo&& b) {
    hello.swap(b.hello);
}
Run Code Online (Sandbox Code Playgroud)

移动任务也一样.