草庐IT

imap_mail_move

全部标签

c++ - 编译器如何知道 move 局部变量?

我很好奇这个功能究竟是如何工作的。考虑类似的事情std::unique_ptrf(){std::unique_ptrlval(nullptr);returnlval;}此代码即使对于仅move类型也能很好地编译,因为编译器会隐式move它。但从逻辑上讲,对于任何返回表达式,确定结果是否引用局部变量将解决暂停问题——如果编译器简单地将所有局部变量视为返回表达式中的右值,那么这将是有问题的,因为变量可以在那个表达式中多次引用。即使本地只有一个直接引用,您也无法证明它没有其他间接别名。那么编译器如何知道何时从返回表达式move? 最佳答案

c++ - 在没有 std::move 的情况下如何按值返回 unique_ptr?

这个问题在这里已经有了答案:Returningunique_ptrfromfunctions(7个答案)关闭8年前。std::unique_ptrptr(){std::unique_ptrp(newint(3));returnp;//Whydoesn'tthisrequireexplicitmoveusingstd::move?}//Whydidn'tthedatapointedtoby'p'isnotdestroyedherethoughpisnotmoved?intmain(){std::unique_ptra=ptr();//Whydoesn'tthisrequirestd::m

c++ - 在 C++11 中编写 Copy/Move/operator= 三重奏的 "correct"方法是什么?

至此,复制构造函数和赋值运算符对的编写就定义好了;快速搜索将使您找到大量有关如何正确编码这些内容的信息。既然移动构造函数已经加入进来,是否有新的“最佳”方式? 最佳答案 最好,它们只是=default;,因为成员类型应该是对您隐藏移动细节的资源管理类型,比如std::unique_ptr。只有那些“低级”类型的实现者才应该费心去处理它。请记住,如果您持有外部(对您的对象)资源,您只需要费心移动语义。它对“平面”类型完全没用。 关于c++-在C++11中编写Copy/Move/operat

c++ - 禁用 move 构造函数

我想禁用类中的move构造函数。我不想move,而是基于复制构造函数。当我尝试编写这段代码时:classBoo{public:Boo(){}Boo(constBoo&boo){};Boo(Boo&&boo)=delete;};BooTakeBoo(){Boob;returnb;}在编译期间我收到错误:errorC2280:'Boo::Boo(Boo&&)':attemptingtoreferenceadeletedfunction如何禁用move构造函数并改为强制复制? 最佳答案 不创建任何move构造函数:classBoo{pub

c++ - 为什么返回时调用的是拷贝构造函数而不是 move 构造函数?

假设我有类(class)MyClass具有正确的move构造函数并且其复制构造函数被删除。现在我像这样返回这个类:MyClassfunc(){returnMyClass();}在这种情况下,move构造函数在返回类对象时被调用,一切都按预期进行。现在假设MyClass有一个的实现运算符(operator):MyClass&operator当我更改上面的代码时:MyClassfunc(){returnMyClass()我收到编译器错误,复制构造函数无法访问,因为它已被删除。但为什么在这种情况下完全使用复制构造函数? 最佳答案 NowI

c++ - 空范围的 std::copy() 或 std::move() 是否需要有效目的地?

下面代码中的std::move()在VisualStudio2013(使用Debug配置)中编译时发出运行时警告,因为它检测到dest是一个空指针。但是,源范围是空的,因此永远不应访问dest。C++标准可能不清楚这是否应该被允许?它声明:要求:结果不得在[first,last]范围内。nullptr似乎可以满足该要求。#include#includeintmain(){std::vectorvec;int*dest=nullptr;//Therange[begin(vec),end(vec))isempty,sodestshouldneverbeaccessed.//However,

C++ OpenCV : tracking moving people on the street

我正在尝试使用C++中的OpenCV对移动的人员进行跟踪,用一个摄像头看着街道,然后人们在街道上移动。对于我拍摄并正在使用的示例视频,请参见此处:http://akos.maroy.hu/~akos/eszesp/MVI_0778.MOV我仔细阅读了这个主题,并尝试了很多方法,包括:背景检测和创建轮廓尝试检测Blob(Blob的关键点)使用HOGDescriptor对每个帧使用人员检测器但是这些都没有提供好的结果。对于我的示例代码,请参见下文。有关基于上述视频的代码输出,请参阅:http://akos.maroy.hu/~akos/eszesp/ize.avi.背景检测到的轮廓为红色,

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