我一直在尝试使用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
同样的问题。
答案 0 :(得分:22)
Boost.Optional支持自Boost版本1.56起移动构造。请参阅the release notes。
答案 1 :(得分:18)
查看boost::optional
源代码,它不会定义移动构造函数或移动赋值。但是,它确实定义了复制构造函数和赋值,这会阻止编译器自动生成移动构造函数和赋值。
编译器将隐式生成移动构造函数作为成员移动,除非您已明确定义了复制构造函数或复制/移动赋值或析构函数
正如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