jjzjj

move-semantics

全部标签

c++ - 在移出 vector 上调用 size() 方法是否安全?

这个问题在这里已经有了答案:Whatconstitutesavalidstatefora"movedfrom"objectinC++11?(2个答案)关闭3年前。标准指定STL容器在beginmoved之后(在这种情况下我们谈论启用move构造/赋值的std::move),在有效,但未指定状态。我相信这意味着我们只能应用不需要先决条件的操作。我记得这里有人在Stackoverflow上声称这是真的,经过一番检查后我同意了。不幸的是,我不记得我检查过哪些来源。此外,我无法在标准中找到相关信息。来自[container.requirements.general/4],table62([ta

C++ 如何在不使用 winapi 的情况下 move 文件并将它们从一个磁盘复制到不同的磁盘?

必须是纯c++,我知道system("copyc:\\test.txtd:\\test.txt");但我认为这是系统功能,而不是c++解决方案,否则我会出错吗? 最佳答案 std::fstream怎么样?打开一个用于阅读,另一个用于写入,然后使用std::copy让标准库处理复制。像这样:voidcopy_file(conststd::string&from,conststd::string&to){std::ifstreamis(from,ios::in|ios::binary);std::ofstreamos(to,ios::o

C++:在字符串中 move 语义#append

我需要将一些字符串合并为一个,出于有效的原因,我想在这种情况下使用move语义(当然这些字符串将不再使用)。所以我尝试了#include#include#includeintmain(){std::stringhello("Hello,");std::stringworld("World!");hello.append(std::move(world));std::cout我以为它会输出Hello,World!##NOTHING##但它实际输出Hello,World!World!如果用operator+=替换append,结果是一样的。这样做的正确方法是什么?我在debian6.10上

c++ - 多次传递输入参数的完美转发

考虑以下函数accept采用T类型的“通用引用”并将其转发给parse()具有左值重载和右值重载的函数对象:templatevoidaccept(T&&arg){parse()(std::forward(arg),0);//copyormove,dependingonrvaluednessofarg}templateclassparse{//parsewillmodifyalocalcopyormoveofitsinputparametervoidoperator()(Tconst&arg,intn)const{/*optimizedforlvalues*/}voidoperator(

c++ - 正确使用工厂类的标准 move

我想创建一个如下所示的工厂类,但我不确定这是使用std::move的正确方法。我不想使用太多的shared_ptr,因为在另一个shared_ptr中的shared_ptr真的很难看,有时还会让人困惑......选项1:classFoo{public:Foo(Foo&&f){...}}classFooFactory{public:staticFoo&&createFoo(...){Footemp(...);returnstd::move(temp);}}main(){Foof=FooFactory::createFoo(...);}选项2:classFooFactory{public:

c++ - 在递归数据结构中 move unique_ptr<T> 数组

尝试编译以下代码会导致以下编译错误:errorC2280:'std::unique_ptr>::unique_ptr(conststd::unique_ptr>&)':attemptingtoreferenceadeletedfunction我的理解是数组“m_children”应该是可move的,因为unique_ptr指向的类型定义了move构造函数。除非这是由类的递归性质或我忽略的某些move语义元素引起的错误?#include#include#includeclassOctreeNode{public:OctreeNode(){};OctreeNode(OctreeNode&&

c++ - 为什么这个 std::string C++ 代码没有给出编译时错误?

我有以下片段:#includeintmain(intargc,char*argv[]){std::stringa,b,c;a+b=c;return0;}为什么这个C++代码没有给出编译时错误?这可能是因为std::string::operator+的实现方式,但我的问题是:为什么要这样实现?在什么情况下需要这种行为? 最佳答案 您可以分配给临时对象。没有规则阻止这种情况。如果您不想临时调用成员函数(在r-value上,更一般地说),您可以使用ref-qualifier在函数声明中。但如你所见here,std::string::ope

c++ - 右值引用绑定(bind)到 std::function 类型的左值

为什么下面的代码在(@)处没有编译错误?我认为lamb是左值,因此它不会绑定(bind)到右值引用。usingFunctionType=std::function;usingIntType=int;structFoo{voidbar(FunctionType&&){}voidbaz(IntType&&){}};Foofoo;foo.bar([](){});//OKautolamb=[](){};foo.bar(lamb);//(@)Nocompilationerror?!foo.baz(5);//OKinti=5;foo.baz(i);//Error 最佳答

c++ - 从自身内部替换 std::function(通过 move 赋值到 *this?)

是否可以用另一个std::function替换一个std::function?以下代码无法编译:#include#includeintmain(){std::functionfunc=[](){std::cout可以修改编译吗?现在的错误消息是:'this'wasnotcapturedforthislambdafunction-我完全理解。但是,我不知道如何捕获func的this指针。我想,它甚至不是lambda中的std::function吧?!如何做到这一点?背景:我想要实现的是:在给定std::function的第一次调用中,我想做一些初始化工作然后替换具有优化功能的原始功能。我

c++ - 为什么没有 std::move_n 算法?

我假设有一个std::copy_n这样就可以与输入迭代器一起使用。出于同样的原因没有std::move_n是否有某种原因? 最佳答案 我认为答案可能很平凡。std::copy永远存在,它是C++03中唯一的算法。N1377(2002)在语言中添加了移动语义,还引入了算法std::move()和std::move_backward()以反射(reflect)现有的std::copy()和std::copy_backward()。这些是唯一存在的复制算法-因此它们是唯一获得move版本的算法。N2569(2008)添加了更多算法,其中大