草庐IT

c++ - 转换运算符的 move 语义

可move转换运算符的语法是什么?我有一个包装obj的包装器,它有一个obj转换运算符:classwrap{public:operatorobj(){...}private:objdata_;};我如何确定data_应该被复制还是move? 最佳答案 它的语法是这样的:classwrap{public:operatorobj()const&{...}//Copyfromme.operatorobj()&&{...}//Movefromme.private:objdata_;};当无法调用第二个版本时将调用第一个版本(即:正在转换的w

C++03 通过构造函数将 vector move 到类成员中( move 语义)

我只能访问C++03,而且我经常想像在C++11中那样将vectormove到函数中。如何做到这一点的问题不会过多地混淆代码的用户。所以我的问题是在C++11之前程序员是如何做到的。我知道可以使用交换函数“move”vector。所以这就是我想出的:classFoo{public:Foo(std::vector&vec){usingstd::swap;swap(vec,m_vec);//"move"vecintomembervector}private:std::vectorm_vec;};//usage:std::vectorv(100,1337);Foofoo(v);//v.emp

c++ - 移动语义和 const 引用

我已经花了很多时间为我的类实现移动语义,但现在我正在处理使用它的函数。好的,所以我有这个对象,它在堆上有很多数据:CLargeOb我为它实现了移动语义(构造函数和运算符=)。理想情况下是这样使用的:voidOtherOb::Func(CLargeOb&&largeOb1,CLargeOb&&largeOb2){SomeOtherFunc(largeOb1);//useobjectsSomeOtherFunc(largeOb2);m_largeOb1=(CLargeOb&&)largeOb1;//saveasmembersandtrashtheoriginalsm_largeOb2=(C

c++ - 什么是消除涉及默认/删除移动/复制语义的样板的好方法?

ScottMeyers有一个goodviewpointontheruleofzero.基本上他提倡默认移动/复制分配/构造,无论你是否真的需要它们。基本上,一般的经验法则是避免编译器生成这些成员,主要是因为它们是混淆的一大来源(我同意这一点)。所以我在考虑一个很好的通用实践,即如何将类定义为默认可移动、可复制或不可移动、不可复制。我想到了boost的boost::noncopyable但我不喜欢为这样的功能目的引入继承的想法。我能想到的唯一有意义的事情就是求助于宏。所以我想到了这样的事情:///Disablecopyconstruct/assignforthegivenclassT#d

C++ 语法/语义问题 : Reference to Function and typedef keyword

什么会typedefint(&rifii)(int,int)用于?这个“声明”之前的typedef是什么?我想把这看作typedef(int(&rifii)(int,int))[newname]但是[新名称]不像你那样存在typedefintINTEGER;以下语法的类似问题:typedefvoid(*PF)();PFedit_ops[]={&cut,&paste,©,&search};PFfile_ops[]={&open,&append,&close,&write};PF*button2=edit_ops;PF*button3=file_ops;button2[2]();t

c++ - C++ 中的默认传递引用语义

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter为指导。9年前关闭。编辑:这个问题更多的是关于语言工程而不是C++本身。我以C++为例来说明我想要什么,主要是因为我每天都在使用它。我不想知道它在C++上是如何工作的,而是就如何完成它展开讨论。这不是它现在的工作方式,这是我希望它可以完成的方式,这肯定会破坏C的兼容性,但这就是我认为extern"C"的全部意义所在。我的意思是,在您现在声明的每个函数或方法中,您必须明确写入该对

C++11 移动语义和右值引用

考虑以下代码:classStringTokenizer{private:charm_delimiter;std::istringstreamm_string;public:explicitStringTokenizer(conststd::string&str,chardelimiter):m_string(str),m_delimiter(delimiter){}templateoperatorContainer(){Containercontainer;for(std::stringtoken;std::getline(m_string,token,m_delimiter);){c

c++ - 右值引用返回类型语义?

像这样的返回类型在C++11中是否代表某种有意义的东西?templateR&&grabStuff();Tinstance=grabStuff();如果R没有移动构造函数,我希望grabStuff应该抛出编译时错误,因为这似乎不允许返回类型使用拷贝构造函数 最佳答案 与往常一样,在返回引用时,您必须返回对函数返回后仍然存在的对象的引用。你如何做到这一点取决于你。示例:Tglobal_thing;T&&get(){returnstd::move(global_thing);}structFoo{Foo(T&&);/*...*/};int

c++ - 在具有 move 语义的 RAII 类中,默认构造函数应该做什么?

move语义非常适合RAII类。它们允许人们像拥有值(value)语义一样进行编程,而无需付出大量复制的代价。一个很好的例子是returningstd::vectorfromafunction.然而,使用值语义编程意味着,人们会期望类型表现得像原始数据类型。这两个方面有时似乎是矛盾的。一方面,在RAII中,人们会期望默认构造函数返回一个完全初始化的对象,或者如果资源获取失败则抛出异常。这保证了任何构造的对象都将处于有效且一致的状态(即可以安全使用)。另一方面,对于move语义,当对象位于validbutunspecifiedstate中时存在一个点.同样,原始数据类型可以处于未初始化状

c++ - 共享内存和写时复制或右值引用和移动语义?

通用容器(如Qt容器中的那种)的共享内存/写时复制实现是否被C++11移动语义和右值引用所取代?哪里失败了,哪里成功了?或者它们是互补的而不是替代品? 最佳答案 写入时复制和移动语义都已用于优化将数据保存在堆上的对象的值语义。例如,std::string已被实现为写时复制对象和支持移动的对象。因此写时复制和移动语义在这方面是相似的:如果您对“复制”的定义足够松散,它们都可以用于优化“复制”。我有时将移动语义描述为写时复制,引用计数被限制为0或1,因此包含引用计数的字段被优化掉了。std::lib中的所有容器现在都使用移动语义,甚至以