草庐IT

c++ - 不可 move -不可复制对象的 vector 的 move 分配不编译

以下代码无法使用VisualStudio2013编译:#includestructX{X()=default;X(constX&)=delete;X&operator=(constX&)=delete;X(X&&)=delete;X&operator=(X&&)=delete;~X()=default;};voidfoo(){std::vectorv;std::vectorw;w=std::move(v);}错误信息说errorC2280:'X::X(X&&)':attemptingtoreferenceadeletedfunction这对我来说毫无意义。您应该不需要X的move构造函

c++ - move 分配和引用成员

对具有引用成员变量的类进行复制分配是禁忌,因为您无法重新分配引用。但是move分配呢?我尝试简单地move,但是当我只想move引用本身时,这当然会破坏源对象:classC{public:C(X&x):x_(x){}C(C&&other):x_(std::move(other.x_)){}C&operator=(C&&other){x_=std::move(other.x_);}private:X&x_;};Xy;Cc1(y);Xz;Cc2(z);c2=c1;//destroysyaswellasz我不应该只实现move分配并坚持move构造吗?这使得swap(C&,C&)难以实现。

c++ - 是否有可复制但不可 move 的类的用例?

看完thisrecentquestion@Mehrdad关于应该使哪些类不可move因此不可复制,我开始想知道是否有一个类的用例可以复制但不能move.从技术上讲,这是可能的:structS{S(){}S(Sconst&s){}S(S&&)=delete;};Sfoo(){Ss1;Ss2(s1);//OK(copyable)returns1;//ERROR!(non-movable)}虽然S有一个复制构造函数,但它显然没有模拟CopyConstructible的概念,因为那又是对MoveConstructible的改进概念,它需要存在(未删除的)move构造函数(参见第17.6.3.1

c++ - 编译器何时应该生成 move 构造函数?

我使用VS11并使用以下内容:classContextWrapper{public:ContextWrapper(){}//itshouldbedefaultedI*guess*inordertohaveautomaticmoveconstructor?//nosupportinVS11forthatnowContext*GetContext(){returnthis->context.get();}voidSetContext(std::unique_ptrcontext){this->context=std::move(context);}//ContextWrapper(Cont

c++ - 如何为这个派生类编写 move 赋值函数?

DuetothisbuginVisualStudio2013,我需要为派生类提供自己的move构造函数和move赋值。但是,我不知道如何为基类调用适当的move函数。代码如下:#include//Baseclass;movable,non-copyableclassshader{public:virtual~shader(){if(id_!=INVALID_SHADER_ID){//Cleanup}}//Moveassignmentshader&operator=(shader&&other){//BrettHale'scommentbelowpointedoutaresourcele

c++ - 使用 std::move c++11 后会持续什么

在可能是类中的字段的变量中使用std::move之后:classA{public:vector&&stealVector(){returnstd::move(myVector);}voidrecreateMyVector(){}private:vectormyVector;};如何重新创建vector,就像一个清晰的?在std::move之后myVector中还剩下什么? 最佳答案 常见的说法是,已“移出”的变量处于有效但未指定的状态。这意味着可以销毁并分配给变量,但没有别的。(我相信Stepanov称其为“部分形成”,这是一个很好

c++ - 为什么这需要一个显式的 std::move?

假设我有一个Foo包含std::vector的类由std::unique_ptrbuild另一个类的对象,Bar.typedefstd::unique_ptrUniqueBar;classFoo{std::vectorbars;public:voidAddBar(UniqueBar&&bar);};voidFoo::AddBar(UniqueBar&&bar){bars.push_back(bar);}这会导致编译错误(在g++4.8.1中)说std::unique_ptr的复制构造函数被删除,这是合理的。这里的问题是,既然bar参数已经是一个右值引用,为什么std::unique_p

c++ - 抽象类和 move 语义

根据“五规则”,当我声明以下之一时:复制或move操作或析构函数我必须编写所有这些,因为编译器不会为我生成它们(其中一些)。但是,如果我的类(A)派生自带有虚拟析构函数的抽象类,这是否意味着A类中的析构函数将被视为“用户定义的”?因此,move语义是否不适用于此类A的对象,因为编译器不会为我生成move构造函数?structInterface{virtualvoidmyFunction()=0;virtual~Interface(){};};structA:publicInterface{voidmyFunction()override{};}; 最佳答案

c++ - 将 unique_ptrs 从一个 vector move 到另一个 vector

我想将存储在它们的未排序vector中的unique_ptrmove到另一个vector,该vector将包含指针的排序vector。确定moveunique_ptr不会自动删除第一个vector中的元素吗?我该怎么做?我想做的例子:std::vector>unsorted,sorted;//fillthe"unsorted"vectorwhile(unsorted.size()>0){constautoit=find_next_element_to_add_to_sorted(unsorted);sorted.push_back(std::move(*it));}我希望意图很明确。更

c++ - C++11 编译器何时会使 RVO 和 NRVO 优于 move 语义和 const 引用绑定(bind)?

考虑从函数返回启用move语义的“完整”对象的情况,如std::basic_string:std::wstringbuild_report()const{std::wstringreport;...returnreport;}那么,我是否真的可以做出“最佳”选择,是否将返回的字符串与move语义一起使用,如conststd::wstringreport(std::move(build_report()));或者如果我应该依靠(N)RVO来发生conststd::wstringreport(build_report());或什至将const引用绑定(bind)到临时用conststd::