是否可以移动提升::可选

Is it possible to move a boost::optional?

本文关键字:可选 移动 是否      更新时间:2023-10-16

我一直在尝试在具有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?还是我应该等到 Boost 支持移动?

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

Boost.

可选仅支持自 Boost 版本 1.56 以来的移动构造。请参阅发行说明。

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

请参阅 Move 构造函数 — 问答:

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

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

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

移动分配也是如此。

目前

尚不清楚C++11功能对boost::optional的支持有多重要。

我在互联网上找到了一个好人,他在提升许可证下给了我一些他自己的代码......仍在进行一些调整。 它已经到了对我有用的地步。 也许它会帮助任何看这个问题的人:

https://github.com/hostilefork/CopyMoveConstrainedOptional

还有一个更大的团队努力来定义一个一直在进行std::optional......但是他们的参考实现无法处理我遇到的一些情况:

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