草庐IT

c++ - 有没有办法将 std::move std::string 放入 std::stringstream

在c++引用中,我没有看到std::stringstream构造函数接受std::string的右值引用。是否有任何其他帮助函数可以在没有开销的情况下将字符串move到stringstream,或者在进行这种限制的背后是否有特殊原因? 最佳答案 从C++20开始,您可以将stringmove到stringstream中:cppreferenceC++20之前的旧答案:Idonotseeastd::stringstreamconstructoracceptingrvaluereferenceofstd::string没错。即使是str

c++ - 传递值导致额外 move

我正在尝试理解move语义和复制/move省略。我想要一个包含一些数据的类。我想在构造函数中传递数据,我想拥有这些数据。看完this,this和this我的印象是,在C++11中,如果我想存储一个拷贝,那么按值传递应该至少与任何其他选项一样有效(除了增加代码大小的小问题)。然后如果调用代码想避免复制,它可以通过传递右值而不是左值来实现。(例如使用std::move)所以我试了一下:#includestructData{Data(){std::cout输出:1.DataWrapperWithMove:constructormoveconstructor2.DataWrapperByVal

c++ - 是否保证在返回时 move 临时对象的子对象?

#include#includeusingnamespacestd;autof(){vectorcoll{"hello"};////MustIusemove(coll[0])?//returncoll[0];}intmain(){autos=f();DoSomething(s);}我知道:如果我只是returncoll;,那么coll肯定会在返回时move。但是,我不确定:coll[0]是否也保证在返回时move?更新:#includestructA{A(){std::coutgcc6.2和clang3.8输出相同:constructedcopy-constructeddestruct

c++ - 复制/move 省略需要复制/move 构造函数的显式定义

考虑以下程序:#include#includeclassT{public:T(){printf("addressatconstruction:%zx\n",(uintptr_t)this);}//T(constT&){printf("copy-constructed\n");}//helps//T(T&&){printf("move-constructed\n");}//helps//T(constT&)=default;//doesnothelp//T(T&&)=default;//doesnothelp};Tf(){returnT();}intmain(){Tx=f();print

c++ - 将其 move 到 map 后访问一对

如果我将一对move到映射中,但由于键已经存在而导致插入失败,我可以在之后安全地使用该对吗?//objectsavailable:map,pairautoinsert_pair=map.insert(std::move(pair));if(!insert_pair.second){//canIsafelyaccesspairhere?}这是否记录在标准中? 最佳答案 鉴于规范的当前状态,您不能对函数调用返回后参数的状态做出任何假设,这看起来多么荒谬(请阅读下文)。要了解原因,我们首先要指出insert()成员函数是根据emplace

c++ - 为什么 std::map 的 move 构造函数不是 noexcept?

正如cppreference.com所说,Mapsareusuallyimplementedasred-blacktrees.所以move一个std::map只是将指针move到根节点+其他信息如大小。为什么std::map的move构造函数没有标记为noexcept? 最佳答案 这是因为我无法说服所有的实现者进入可以放入map的无资源状态。例如,一个实现需要有一个端节点指向,即使在默认构造状态下也是如此。允许(但不是必需)实现将该端节点放在堆上。Amoved-frommapmustbeinavalidstate.IE。当end()

c++ - "Extending move semantics to *this"是什么意思?

拜托,有人可以用简单的英语解释什么是“Extendingmovesemanticsto*this”吗?Iamreferringtothisproposal.我要寻找的只是什么是什么以及为什么我们需要它。请注意,我确实理解一般的右值引用是什么,move语义是建立在它之上的。我无法理解这样的扩展添加到右值引用的内容! 最佳答案 ref-qualifier特性(指示*this的类型)将允许您区分成员函数是否可以在右值或左值(或两者)上调用,并根据那。firstversion在非正式部分给出了一些理由:Preventsurprises:st

c++ - 我应该如何编写函数参数来执行 move 而不是复制?

我想使用该类的构造函数将一个大容器从一个返回值move到另一个类中。如何制定参数以确保它最终不会被复制?/*forthesakeofsimplicity,imaginethistypedeftobeglobal*/typedefstd::unordered_mapumap;umapfoo(){umapm;/*fillwithlotsofdata*/returnm;}classBar{public:Bar(umapm):bm(m){}private:umapbm;};BarmyBar(foo());//runfooandpassreturnvaluedirectlytoBarconstr

windows - 将多个文件从多个文件夹 move 到一个文件夹

我正在寻找一个.bat文件,它可以查看包含同名子文件夹的多个文件夹,并将其内容move到指定文件夹。文件夹结构:主文件夹MainTextures_folderProp文件夹--model1_子文件夹------Textures_subfolder----------图像文件--model2_子文件夹--------Textures_subfolder----------图像文件--model3_子文件夹--------Textures_subfolder----------图像文件--model4_子文件夹--------Textures_subfolder----------图像文件

c++ - move 语义和窗口句柄。 DeleteObject 安全句柄?

Windows中是否存在某种NULL句柄?如果我通过CreateCompatibleBitmap()创建一个bmp并通过DeleteObject()删除它并且想要使用move语义,我想确保位图没有被破坏。因此,我必须将HBITMAP设置为可以安全删除的值。比如deletenullptr。 最佳答案 首先是坏消息。由于历史原因,WindowsAPI中没有普遍有效的“无效句柄”值。Windows中的不同子系统将NULL或INVALID_HANDLE_VALUE视为无效句柄值(用于返回无效句柄值和获取无效句柄值)。Relatedartic