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::optional 修改 Boost 源代码的情况下移动 a?还是我应该等到 Boost 支持移动?

我过去也有同样的问题boost::any

4

3 回答 3

22

Boost.Optional 仅从 Boost 版本 1.56 开始支持移动构造。请参阅发行说明

于 2014-09-22T15:20:47.783 回答
18

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

请参阅移动构造函数 - Q&A

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

正如 Luc Danton 建议的那样,需要有一种治疗方法。让我们尝试使用swap来移动boost::optional,希望创建一个空boost::optional值便宜,然后我们只需将默认构造boost::optional的与来自 r-value的构造交换foo,例如:

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

移动任务也是如此。

于 2012-05-28T11:08:04.417 回答
3

目前尚不清楚 C++11 特性对 boost::optional 的支持有多重要。

我在 Internet 上找到了一个好人,他在 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 回答