我一直试图在一个带有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:调用已删除的foo foo b构造函数(std::move(A));^ foo.cc:9:3:注意:函数已显式标记在foo(foo&&) = default;^1错误生成。
有没有一种无需修改Boost的源代码就可以移动boost::optional的方法?还是我应该等到Boost支持移动?
我过去对boost::any也有过同样的问题。
发布于 2012-05-28 11:08:04
查看boost::optional源代码,它不定义移动构造函数或移动赋值。但是,它确实定义了复制构造函数和赋值,从而防止编译器自动生成移动构造函数并为其分配。
请参阅移动构造函数- Q&A
编译器将隐式地以成员级移动生成移动构造函数,除非您已显式定义了复制构造函数或复制/移动分配或析构函数。
正如吕克·丹顿所建议的那样,需要有一种治疗方法。让我们尝试使用swap移动boost::optional,希望创建一个空的boost::optional很便宜,然后我们只需将默认构造的boost::optional与r值foo中的boost::optional交换,例如:
foo(foo&& b) {
hello.swap(b.hello);
}调动任务也是一样。
发布于 2014-09-22 15:20:47
只有在Boost版本1.56之后,Boost.Optional才支持移动构造。见发布说明。
发布于 2012-10-05 00:36:33
目前还不清楚C++11对boost::可选功能的支持有多高。
我在互联网上找到了一个很好的家伙,他在boost license...which下给了我他自己的一些代码,现在还在做一些调整。它就在对我有用的时候。也许这会对任何研究这个问题的人有所帮助:
https://github.com/hostilefork/CopyMoveConstrainedOptional
还有一个更大的组来定义一个std::optional,它一直在使用on...but --它们的引用实现无法处理我遇到的一些情况:
http://kojot.sggw.waw.pl/~akrzemi1/optional/tr2.optional.proposal.html
https://stackoverflow.com/questions/10783391
复制相似问题