首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以移动助推::可选?

是否可以移动助推::可选?
EN

Stack Overflow用户
提问于 2012-05-28 10:50:45
回答 3查看 8.2K关注 0票数 26

我一直试图在一个带有boost::optional成员变量的类中定义一个默认的移动构造函数。

代码语言:javascript
运行
复制
#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也有过同样的问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-28 11:08:04

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

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

编译器将隐式地以成员级移动生成移动构造函数,除非您已显式定义了复制构造函数或复制/移动分配或析构函数。

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

代码语言:javascript
运行
复制
foo(foo&& b) {
    hello.swap(b.hello);
}

调动任务也是一样。

票数 18
EN

Stack Overflow用户

发布于 2014-09-22 15:20:47

只有在Boost版本1.56之后,Boost.Optional才支持移动构造。见发布说明

票数 24
EN

Stack Overflow用户

发布于 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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10783391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档