草庐IT

c++ - 我可以从 std::vector 中 std::move() 一个元素吗?

我有一个std::vector可以在循环中重复使用。可以输出std::move个元素吗?如果我将第i个元素移出,那么第i个slot会进入未定义但有效的状态,但是vector呢?它的状态是否仍然定义和有效?另外,我可以clear()然后在下一次迭代中重用vector吗?编辑:请在标记重复之前阅读问题。我在做v2之后询问std::move(v2[0])的状态,而不是std::move(v2)。在我做v2之后,我也重用了v2.clear()。这与建议的重复有何相似之处?编辑:代码示例:structFoo{stringdata;/*otherdatamemebers*/voidworkOnDa

返回锁时的C++ 11 move

在《C++ConcurrencyinAction》一书中阅读以下方法std::unique_lockwait_for_data(){std::unique_lockhead_lock(head_mutex);data_cond.wait(head_lock,[&]{returnhead.get()!=get_tail();});returnstd::move(head_lock);}我不明白为什么head_lock在返回时是std::move-ed。我对move用法和RVO的概念和直觉与C++11rvaluesandmovesemanticsconfusion(returnstatem

c# - System.IO.Directory.Move(tempPath, newFolder) 抛出异常访问被拒绝

我正在尝试使用此将文件夹从一个目录移动到另一个目录System.IO.Directory.Move(tempPath,newFolder);我是我计算机的管理员,所以我应该拥有完全访问权限。我不明白为什么我每两次尝试都会遇到一次此异常。Accesstothepath'D:\'isdenied. 最佳答案 仅仅因为您是管理员并不意味着您可以访问所有内容。在您不一定能访问的内容中:SYSTEM拥有的文件/目录,不明确允许管理员(例如C:\SystemVolumeInformation)被其他进程使用“共享”设置阻止您访问的文件锁定

c++ - std::move() 或其在局部变量上的显式等效项是否允许省略?

例如:Bigcreate(){Bigx;returnstd::move(x);//returnstatic_cast::type&&>(t)//whynotelidehere?}假设应用std::move()返回局部变量会抑制move语义,因为编译器通常无法对函数的内部工作做出任何假设,如果不需要这些假设,例如当:std::move(x)是内联的(可能总是)std::move(x)写成:static_cast::type&&>(t)根据当前标准,允许实现应用NRVO...—inareturnstatementinafunctionwithaclassreturntype,whenthe

c++ - 从 STL 容器中 move 元素是否会将其从该容器中移除?

我有一个Foobar类,它带有一个输出“Wellhellothere!”的sayHello()方法。如果我写下面的代码vector>fooList;fooList.emplace_back(newFoobar());unique_ptrmyFoo=move(fooList[0]);unique_ptrmyFoo2=move(fooList[0]);myFoo->sayHello();myFoo2->sayHello();cout输出是:Wellhellothere!Wellhellothere!vectorsize:1我很困惑为什么会这样。当我迈出第一步时,fooList[0]不应该变

C++11:按值调用、 move 语义和继承

假设我有一个类,我打算将其直接公开为可实例化的类对程序员:classBase{public:Base(std::stringtext):m_text(std::move(text)){}private:std::stringm_text;};到目前为止一切顺利。这里不需要右值构造函数。现在,在未来的某个时刻,我决定扩展Base:classDerived:publicBase{public:Derived(conststd::string&text):Base(text){}};这让我很烦恼:我不能在Derived中按值获取字符串,因为那是Base已经在做-我最终会得到2个拷贝和1个mo

c++ - std::move 和 RVO 优化

我最近读到std::move如何通过移动值而不是复制它们来加速代码。所以我做了一个测试程序来比较使用std::vector的速度。代码:#include#include#include#ifdefWIN32#include#else#include#include#endif#undefmax//ReturnstheamountofmillisecondselapsedsincetheUNIXepoch.Worksonboth//windowsandlinux.uint64_tGetTimeMs64(){#ifdef_WIN32//WindowsFILETIMEft;LARGE_INT

c++ - 有没有办法在不使用 std::move 的情况下用构造类初始化类?

//Exampleprogram#include#include#includeclassA{public:intx;};classB{public:B(A&&a):m_a(std::move(a)){}Am_a;};intmain(){Bvar(std::move(A()));//Bvar(A());//doesnotcompilewhy?std::cout在上面的代码片段中,被注释掉的行无法编译。错误消息似乎将var视为函数声明。即使A具有构造函数的参数,它仍然被视为函数声明。有没有一种方法可以将它写成不被视为函数声明?在这种情况下,使用typename没有帮助。

c++ - C++ 对象没有得到 std::moved 吗?

我得到以下代码:(CodeLive:C++Shell)classWorker{public:Worker(std::stringname):_name(name){};Worker(constWorker&worker):_name(worker._name){std::cout_name=name;}private:std::string_name;};classFactory{public:Factory(){std::coutworkers.push_back(std::move(worker));}Worker&getLastWorker(){this->workers.bac

c++ - 从不同的容器 move 构造 `std::map`

我想将临时容器转换为std::map.假设临时容器是一个std::unordered_map,与T可move构造。我的问题是:(如何)我可以使用std::map的move构造函数?对于简化的情况,考虑#includeusingnamespacestd;templatemapconvert(unordered_mapu){//Question:(how)canIusemoveconstructorhere?mapm(u.begin(),u.end());returnm;}intmain(){unordered_mapu;u[5]=6;u[3]=4;u[7]=8;mapm=convert(