是否可以移动提升::可选
Is it possible to move a 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 源代码的情况下移动boost::optional
?还是我应该等到 Boost 支持移动?
我过去在boost::any
上也有同样的问题。
可选仅支持自 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
- 可组合的lambda/std::函数与std::可选
- 使用gcc从静态链接的文件中查找可选符号
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 在 G++ v8.2.0 中使用 std::experimental::可选
- 标准::可选枚举的比较运算符
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 扩展类中的可选 vir 函数,测试它在运行时是否存在
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 未定义的引用,尽管存在符号,但 std::experimental::可选
- 命名空间 std:: 不包含可选
- 将可选属性表示为 C++类成员
- 如何使用可选的随机种子参数创建 roll_die() 函数
- 为什么移动 std::可选不重置状态
- 为什么当T不可移动时,STD ::可选的移动构建体不会被删除
- 是否可以移动提升::可选
- 如何从标准::可选<T>移动
- 包含boost::可选对象的std::矢量对象是否可以移动?可移动助推::可选