草庐IT

c++ - 为什么我们需要在 move 构造函数中将右值引用设置为空?

//codefromhttps://skillsmatter.com/skillscasts/2188-move-semanticsperfect-forwarding-and-rvalue-referencesclassWidget{public:Widget(Widget&&rhs):pds(rhs.pds)//takesource’svalue{rhs.pds=nullptr;//why??}private:structDataStructure;DataStructure*pds;};我无法理解将rhd.pds设置为nullptr的原因。如果我们删除这一行会发生什么:rhs.p

c++ - std::move 在类模板中的构造函数初始值设定项列表中

我有一个这样的模板:templatestructfoo{Tm_t;foo(Tt):m_t(t){}};问题是我想为T支持小型/常规类型和大型类型(如矩阵)。你推荐我这样写构造函数初始化列表吗foo(Tt):m_t(std::move(t)){}并要求T类型始终支持move构造,即使对于较小的类型也是如此?有没有更好的方法? 最佳答案 andrequirethatthetypeTalwayssupportmoveconstruction,evenforsmallertypes?任何可复制构造的类型也可move构造。在这些情况下move

c++ - 右值引用 : Why aren't rvalues implicitly moved?

在关于C++右值引用(http://www.artima.com/cppsource/rvalue.html)的Artima文章中有这样的话:这就是为什么在向下传递到基类时必须说move(x)而不是只说x的原因。这是移动语义的一个关键安全特性,旨在防止从某个命名变量意外移动两次。我想不出这样的双招可以执行的情况。你能举个例子吗?换句话说,如果T&&的所有成员都是右值引用而不仅仅是引用,会出现什么问题? 最佳答案 考虑这个场景:voidfoo(std::stringx){}voidbar(std::stringy){}voidtest

C++11:使用 std::move 只对临时对象安全吗?

在我的代码中,我有这样的东西:unordered_multimap>mEntities;...vector>rawEntities;if(qi::phrase_parse(&buf[0],(&buf[0])+buf.size(),EntityParser(),qi::space,rawEntities)){for(auto&propGroup:rawEntities){autosearch=propGroup.find("classname");if(search!=propGroup.end()){//isstealingpropGroupsafe???mEntities.empla

c++ - 为什么可以 move 不可变的 lambda 捕获?

AFAIK非可变lambda将变量捕获为常量。这让我想知道为什么他们还能被感动?autop=std::make_unique(0);autof=[p=std::move(p)](){p->reset();};//Error,pisconstautof2=std::move(f);//OK,thepointerstoredinsidelambdaismoved 最佳答案 AFAIKnon-mutablelambdascapturevariablesasconst.不,他们没有。它们的operator()重载是const。实际的成员变量

c++ - std::move 和 unique_ptr::reset 之间有什么区别?

对于std::unique_ptr的p1和p2,std::move()有什么区别>和std::unique_ptr::reset()?p1=std::move(p2);p1.reset(p2.release()); 最佳答案 根据[unique.ptr.single.assign]/2中移动分配的标准规范,答案应该是显而易见的:Effects:Transfersownershipfromuto*thisasifbycallingreset(u.release())followedbyanassignmentfromstd::forw

c++ - 对于可 move 类型,删除 std::vector 中间的元素仍然很昂贵吗?

通常认为删除std::vector中间的元素代价高昂,因为它需要复制它之后的每个元素来填充空洞。在C++11中,std::vector将向下move所有元素,这应该非常快(如果仅与拷贝相关),至少我是这么认为的。当然,它在时间上仍然是线性的,但总的来说它应该比旧版本更快。这是真的吗?我再也不用担心删除中间的某些对象了吗? 最佳答案 这取决于vector中的内容。如果它是POD或指针,我无法想象它会有什么不同。如果类实例复制起来很繁重,但可以非常快速地move,我希望使用C++0x可以加速。但是,我认为如果从std::vectors中

c++ - move 语义 - 它是关于什么的?

这个问题在这里已经有了答案:10年前关闭。PossibleDuplicate:Cansomeonepleaseexplainmovesemanticstome?有人可以给我指出一个好的来源或在这里解释什么是move语义? 最佳答案 暂时忘记C++0x。move语义是独立于语言的东西——C++0x仅仅提供了一种标准方式来执行move语义操作。定义move语义定义了某些操作的行为。大多数情况下,它们与复制语义形成对比,因此首先定义它们会很有用。与的分配复制语义具有以下行为://Copysemanticsassert(b==c);a=b;

c++ - 是否有必要定义来自不同类的 move 构造函数?

考虑以下几点:structX{Yy_;X(constY&y):y_(y){}X(Y&&y):y_(std::move(y)){}};是否有必要像第二个那样定义一个构造函数以充分利用move语义?还是会在适当的情况下自动处理? 最佳答案 是的,但不是。你的代码应该是这样的:structX{Yy_;X(Yy)://eithercopy,move,orelideaYy_(std::move(y))//andmoveittothemember{}};如果您在设计中说过“我需要我自己的数据拷贝”*,那么您应该按值获取参数并将其move到需要的

c++ - 根据析构函数和 move 构造函数实现 move 赋值

假设我有一个管理内存的类,因此需要用户定义的特殊成员函数(想象vector或类似的)。考虑以下move赋值运算符的实现:Class&operator=(Class&&rhs){this->~Class();//calldestructornew(this)Class(std::move(rhs));//callmoveconstructorin-place}以这种方式实现move赋值运算符是否有效?也就是说,以这种方式调用析构函数和构造函数不会违反语言中的任何对象生命周期规则吗?以这种方式实现move赋值运算符是一个好主意吗?如果不是,为什么不,是否有更好的规范方法?