草庐IT

move_disc

全部标签

c++ - 允许在一个完整表达式中 move 两次

假设一个函数具有以下原型(prototype)templatestd::unique_ptrprocess_object(std::unique_ptrptr);该函数可能返回(move版本)传递给它的对象,或完全不同的对象。如下使用这个函数,C++合法吗?std::unique_ptrpw(newWidget());pw=process_object(std::move(pw));如果我没记错的话,有一条C/C++规则禁止在单个完整表达式中多次修改对象。这条规则在这里适用吗?如果是的话,有什么方法可以在一行中以不同的方式表达这个成语吗?如果将std::unique_ptr替换为被鄙视

c++ - 在什么情况下我应该明确需要实现 move 构造函数和 move 赋值运算符?

鉴于一个类实际上是可move的,手动实现类的move构造函数和move赋值运算符很快就会变得乏味。我想知道什么时候这样做实际上是一个沉重、沉重、过早的优化?例如,如果一个类只有微不足道的POD数据或本身定义了move构造函数和move赋值运算符的成员,那么我猜编译器要么只是优化大量的垃圾(在POD),否则使用成员的move构造函数和move赋值运算符。但这能保证吗?在什么情况下我应该期望明确需要实现move构造函数和move赋值运算符?编辑:如下所述,NicolBolas在https://stackoverflow.com/a/9966105/6345对他的回答的评论中提到,在Visu

c++ - libc++ vs libstdc++ std::is_move_assignable:哪个最正确?

我试图通过阅读C++14标准以及libc++和libstdc++的源代码来更深入地了解C++。各种执行type_traits项目在两者之间有所不同,尤其是is_move_assignable,我试图找出其中哪个“更正确”。libc++:templatestructis_move_assignable:publicis_assignable::type,consttypenameadd_rvalue_reference::type>{};libstdc++:template::value>struct__is_move_assignable_impl;templatestruct__is

c++ - 以下 move 构造函数代码安全吗?

这是类X的move构造函数:X::X(X&&rhs):base1(std::move(rhs)),base2(std::move(rhs)),mbr1(std::move(rhs.mbr1)),mbr2(std::move(rhs.mbr2)){}这些是我很警惕的事情:我们正在从rhs两次move,并且rhs不能保证处于有效状态。这不是base2初始化的未定义行为吗?我们正在将rhs的相应成员move到mbr1和mbr2但由于rhs已被move从(同样,它不能保证处于有效状态)为什么要这样做?这不是我的代码。我在一个网站上找到它。这个move构造函数安全吗?如果有,怎么做?

c++ - 我应该返回一个右值引用(通过 std::move'ing)吗?

一个C++Nextblogpost说过Acompute(…){Av;…returnv;}如果A具有可访问的拷贝或移动构造函数,编译器可能会选择省略拷贝。否则,如果A具有移动构造函数,则移动v。否则,如果A具有复制构造函数,则复制v。否则,会发出编译时错误。我认为我应该总是返回不带std::move的值因为编译器将能够为用户找出最佳选择。但在博客文章的另一个例子中Matrixoperator+(Matrix&&temp,Matrix&&y){temp+=y;returnstd::move(temp);}这里std::move是必要的,因为y必须被视为函数内的左值。啊,读完这篇博文后,我的

c++ - 为了支持 move 语义,函数参数应该由 unique_ptr、value 还是 rvalue 获取?

我的一个函数将vector作为参数并将其存储为成员变量。我正在使用对vector的const引用,如下所述。classTest{public:voidsomeFunction(conststd::vector&items){m_items=items;}private:std::vectorm_items;};但是,有时items包含大量字符串,所以我想添加一个支持move语义的函数(或用新函数替换该函数)。我正在考虑几种方法,但我不确定选择哪一种。1)unique_ptrvoidsomeFunction(std::unique_ptr>items){//Also,make`m_itm

c++ - propagate_on_container_move_assignment 的示例用法

我正在尝试了解如何正确书写AllocatorAware容器。我的理解是,propagate_on_container_move_assignmenttypedef表示Container本身被move-assign时是否需要复制某个Allocator类型。所以,由于我找不到这方面的任何示例,我自己的尝试将类似于以下内容:给定一个容器类型Container、一个Allocator类型allocator_type和一个内部allocator_type数据成员m_alloc:Container&operator=(Container&&other){if(std::allocator_trai

c++ - 默认 move 构造函数/赋值和删除的复制构造函数/赋值

按照标准,IfthedefinitionofaclassXdoesnotexplicitlydeclareamoveconstructor,onewillbeimplicitlydeclaredasdefaultedifandonlyif—Xdoesnothaveauser-declaredcopyconstructor,—Xdoesnothaveauser-declaredcopyassignmentoperator,—Xdoesnothaveauser-declaredmoveassignmentoperator,and—Xdoesnothaveauser-declareddest

c++ - 为什么我不能在 C++14 的 lambda 中 move std::unique_ptr?

我想在lambda中传递一个原始指针,但如果未调用lambda,我不希望它被泄露。它看起来像这样:voidClean(std::unique_ptr&&list);voidf(int*list){thread_pool.Push([list=std::unique_ptr(list)]{Clean(std::move(list));//我在Clang3.7.0中遇到错误:error:bindingofreferencetotype'unique_ptr'toavalueoftype'unique_ptr'dropsqualifiers但我一开始没有看到任何限定词,尤其是被丢弃了。另外,

c++ - 为什么在 lambda 中 move 时不调用 move 构造函数?

我正在尝试编译以下代码:#includestructC2{C2()=default;C2(C2const&)=delete;C2(C2&&)=default;};intmain(){C2p2;([p2_1{std::move(p2)}](){autop2_2=std::move(p2_1);//但是,这不会编译并给出一个错误,即对p2_2的赋值正在调用已删除的函数,即复制构造函数。请注意,move到p2_1很好。为什么不使用move构造函数? 最佳答案 这里要注意的是,lambda表示的匿名类类型的operator()默认为cons