草庐IT

move_disc

全部标签

c++ - 关于根据 move 赋值和 move 构造函数实现 std::swap

这里是std::swap的可能定义:templatevoidswap(T&a,T&b){Ttmp(std::move(a));a=std::move(b);b=std::move(tmp);}我相信std::swap(v,v)保证没有效果并且std::swap可以如上实现。在我看来,以下引述暗示这些信念是矛盾的。17.6.4.9函数参数[res.on.arguments]1EachofthefollowingappliestoallargumentstofunctionsdefinedintheC++standardlibrary,unlessexplicitlystatedother

C++11 move(x) 实际上意味着 static_cast<X&&>(x)?

这个问题在这里已经有了答案:Whenisthemoveconstructorcalledinthe`std::move()`function?(2个答案)关闭9年前。刚刚阅读了Stroustrup的C++编程语言第4版,在第7章中他说:move(x)meansstatic_cast(x)whereXisthetypeofx和Sincemove(x)doesnotmovex(itsimplyproducesanrvaluereferencetox)itwouldhavebeenbetterifmove()hadbeencalledrval()我的问题是,如果move()只是将变量转换为r

c++ - 为 POD-ish 类型 move 语义

为仅包含基本类型的结构或类实现move构造函数和move赋值运算符是否有意义?例如,structFoo{floatx;floaty;floatz;///...ctor,copyctor,assignmentoverload,etc...};我可以看到,如果我有更复杂的东西,比如:structBar{floatx,y,z;std::stringName;};在我宁愿moveName而不是复制它的地方,move构造函数是有意义的。但是,“move”float对我来说(语义上)没有意义。想法? 最佳答案 即使您有std::string成员

c++ - 是否 move 分配一个 std::fstream 关​​闭原始流

从c++11开始,我们可以move分配一个std::fstream反对另一个,但我找不到说明如果fstream会发生什么的文档对象已与文件(is_open()==true)相关联。所以我的问题是是否在下面的代码中,File1.txt将正确关闭或者如果我必须手动关闭它。如果我必须手动完成,如果我不这样做会怎样?std::fstreamfile("File1.txt");file=std::fstream("File2.txt");//willthisimplicitlycallfile.close()? 最佳答案 fstream对象的

c++ - 可以使用 move 语义更改或改进此 C++ 代码吗?

structbig_struct{vectora_vector;mapa_map;};big_structmake_data(){big_structreturn_this;//dostuff,buildthatdata,etcreturnreturn_this;}intmain(){autodata=make_data();}我已经看到应用于构造函数的move语义,但在这段代码中,我想知道在返回时是否完全复制了大结构。我什至不确定它与move语义有关。C++是否总是复制这种数据,还是对其进行了优化?可以更改或改进此代码吗?返回vector或map的函数怎么样?该map/vector是

c++ - 编译器不生成 move 构造函数

我试图了解move语义正在查看编译器生成的move构造函数(复制和赋值)。在ModernEffectiveC++中,ScottMeyers在第17项中说,如果没有声明显式复制构造函数,编译器将生成move构造函数,这将为non-static执行成员明智的move成员。为了确认这一点,我正在尝试以下代码:#include#includeusingnamespacestd;classA{private:std::stringstr;public:A():str("Initstring"){cout输出是:DefaultconstructorConstructorwithstringobj1

c++ - 我应该在移动构造函数/赋值运算符中使用 std::move 还是 std::forward?

除非我错了,否则似乎两者都可以正常工作-是否有最佳实践理由更喜欢一个而不是另一个?例子:structA{A(){}A(constA&){std::cout(right.x)){std::cout输出:---BTest---A(A&&)B(B&&)---CTest---A(A&&)C(C&&)---DTest---A(constA&)D(D&&) 最佳答案 问题是:那些真的是类的移动构造函数/赋值运算符吗?或者它们只是从您的眼角看起来像那样?structX{X(X&&);//movector#1templateX(T&&);//per

c++ - std::vector::erase() 不想 move

我有一个std::vector其中Foo是一个包含Foo(Foo&&)noexcept的类.向容器中添加对象完美无缺,但是使用std::vector::erase(iterator)删除它们不会,GCC4.7会尝试调用我已删除的赋值运算符。确切的错误信息是:错误:使用已删除的函数‘Foobar&Foobar::operator=(constFoobar&)编辑:当然std::vector调用赋值运算符,而不是复制构造函数(您也可以在错误消息中看到这一点)。已在说明中修复它,抱歉。这里是请求的示例源代码:#includeclassFoo{public:Foo(){}Foo(Foo&&ot

c++ - move 语义不完整吗?

在复制效率低下的情况下,move语义取代了复制语义。复制语义完全处理可复制对象,包括const对象。在c++11中已经存在无数不可复制的对象,例如std::unique_ptr。这些对象完全依赖于move语义,因为从一个对象move允许使它无效。这对于像RAII这样的流行设计模式很重要(恕我直言)。将const不可复制对象分配给内存区域时会出现问题。这样的对象无法以任何方式恢复。这在对象的生命周期中显然很重要,因为它是常量。然而,在它的生命周期结束时,当调用析构函数时,(不存在的)对象暂时是非常量的。我建议move析构函数可能是move语义模型的一个有值(value)的补充。考虑一个简

c++ - 使用 unique_ptr move 语义

我使用的是VisualStudio2012Update2,我无法理解为什么std::vector试图使用unique_ptr的复制构造函数。我看过类似的问题,大多数都与没有显式move构造函数和/或运算符有关。如果我将成员变量更改为字符串,我可以验证是否调用了move构造函数;但是,尝试使用unique_ptr会导致编译错误:errorC2248:'std::unique_ptr::unique_ptr':cannotaccessprivatememberdeclaredinclass'std::unique_ptr'.我希望有人能指出我所缺少的,谢谢!#include#include