草庐IT

c++ - map move 插入是否保证元素被 move 或不被 move ?

C++中的标准“映射”容器允许您插入右值:Tx;std::mapm;//m[1];//populate"1"autoit=m.insert(std::make_pair(1,std::move(x)));问题是当元素已经存在时会发生什么,即it->second==false。元素x是否已被“移出”?例如,如果它是一个唯一指针,x是否已被重置为null?显然,上述情况的答案是"is",因为移出已经在创建对时发生了。但是假设现在我想更新现有值,但仍然保留该值是否已经存在的信息(所以我不能只说m[1]=std::move(x);)。在那种情况下是否可以“不离开”对象?我在GCC中发现以下工作

c++ - 理解 c++11 右值、 move 语义和性能

这个问题在这里已经有了答案:关闭9年前。PossibleDuplicate:WhathappensifIreturnliteralinsteadofdeclaredstd::string?考虑以下代码stringgetName(){return"meme";}stringname=getName();getName()函数返回一个临时对象。在C++03中,我理解string的复制构造函数被调用并且临时对象被销毁。实际上,编译器(至少在GCC4.7中)似乎通过不创建对象name而是将其替换为临时对象本身而不是销毁临时对象来优化第5行。(我尝试使用MyVector类,而不是std::str

c++ - std::move 在 boost 库中的对应物

我正在尝试在我的代码中使用std::move,但我使用的编译器(g++4.4)不支持它。boost::move可以完全替代std::move吗?谢谢。 最佳答案 std::move(和boost::move当启用c++0x支持时)只是来自T&的转换至T&&.它实际上并没有移动任何东西。这意味着指针的具体类型T&&必须得到编译器的支持。GCC从4.3版本开始支持右值引用,所以boost版本应该没问题。但是,有没有理由不能使用std::move来自#include?http://en.cppreference.com/w/cpp/uti

c++ - 为什么需要 std::move?

我读了一个beautifularticleC++11中的移动语义。这篇文章是用一种非常直观的方式写的。下面给出文章中的示例类。classArrayWrapper{public://defaultconstructorproducesamoderatelysizedarrayArrayWrapper():_p_vals(newint[64]),_metadata(64,"ArrayWrapper"){}ArrayWrapper(intn):_p_vals(newint[n]),_metadata(n,"ArrayWrapper"){}//moveconstructorArrayWrapp

c++ - 为什么 C++ 左值对象不能绑定(bind)到右值引用 (&&)?

move语义的想法是您可以从另一个临时对象(由右值引用引用)中获取所有内容并将该“所有内容”存储在您的对象中。这有助于避免在事物的单一构造就足够的情况下进行深度复制——因此您在右值对象中构造事物,然后将其move到长期存在的对象中。为什么C++不允许将左值对象绑定(bind)到右值引用?两者都允许我更改引用的对象,因此在访问引用对象的内部方面对我来说没有区别。我能猜到的唯一原因是函数重载歧义问题。 最佳答案 ButwhyC++doesn'tallowbindinglvalueobjectstorvaluereferences?假设您

c++ - move 操作的条件编译

如何检查我的编译器是否支持右值引用?是否有标准的预处理器宏,或者不同的编译器有不同的宏?理想情况下,我想这样写:#ifdefRVALUE_REFERENCES_SUPPORTEDfoobar(foobar&&that){//...}#endif 最佳答案 我不知道有任何标准的预处理器宏,但是:VisualStudio在VC2010引入了支持,内部版本是1600,可以用_MSC_VER>=1600查看自version4.3以来,GCC一直支持右值引用,因此您可以检查该版本以及__GXX_EXPERIMENTAL_CXX0X__Clan

c++ - 使用 std::move

在C++11之前,我使用swap-to-back来避免深度复制开销,例如:vector>Objects;for(/*somerange*/){vectorv;for(/*someotherrange*/){v.push_back(/*someobject*/);}Objects.push_back(vector());Objects.back().swap(v);}我如何使用std::move将v移动到Objects中而不是swap?我知道这里有很多变通方法,比如多数组或直接插入Objects.back(),但我需要一个std::move的用法示例明白了。

c - Ncurses - 多窗口和刷新

我正在编写一个小型学校项目。这是一个单词下降游戏-单词从顶部移动到底部。我有一个想法,制作两个窗口(一个带有界面,第二个带有移动对象)。正如您在代码中看到的那样,单词是随机的。问题是输入。我正在使用mvwsacanw来写这个词。当单词在不同的窗口中移动时,有没有办法在第二个窗口中写任何东西?现在这个词正在下降,当它到达底部时,第二个窗口打开,我可以输入这个词。希望有人能帮助我。#include#include#include#include#includevoidmoving(WINDOW*move){intj,random;char*cmp=(char*)malloc(10*size

windows - 从 ReplaceFile 重现 ERROR_UNABLE_TO_MOVE_REPLACEMENT_2 错误代码

我正在使用ReplaceFileWin32函数作为获取原子行为的操作的一部分。在该函数的三个特殊错误代码中,我已经能够从两个错误代码中重现和恢复(回滚):ERROR_UNABLE_TO_MOVE_REPLACEMENT和ERROR_UNABLE_TO_REMOVE_REPLACED。我的问题与第三个错误代码有关:ERROR_UNABLE_TO_MOVE_REPLACEMENT_2。有没有人看到返回此错误代码?在什么条件下是可能的?关于如何重现此错误以便我可以测试从错误中恢复的代码中的路径有什么想法吗?我从文档中了解到,要从此错误中恢复(回滚),我需要将替换文件重命名回其原始名称,因为R

c# - 汉诺塔 : Moving Rings from Peg to Peg

扩展我之前的帖子,我还在写汉诺塔。在解释了如何在钉子上画环的绝妙解决方案之后,我仍然有一个问题,我已经摆弄了很长一段时间了。这是我的PegClass:namespaceTowers_Of_Hanoi{classPegClass{privateintpegheight;privateinty=3;int[]rings=newint[0];publicPegClass(){//thisisthedefaultconstructor}publicPegClass(intheight){pegheight=height;}//otheruserdefinedfunctionspublicvoi