草庐IT

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

c++ - 一个类型是否应该只 move ,仅仅因为复制可能很昂贵?

我有一个可复制的类型,但复制成本可能很高。我已经实现了move构造函数和move赋值。但是我遇到了性能问题,人们在按值传递时忘记调用move()。删除复制构造函数并为实际需要复制的罕见情况提供显式copy()方法是否是一种好的C++11风格?这在其他语言(Ruby、JavaScript)中是惯用的,但我不知道C++标准库中有任何内容纯粹为了性能而禁止复制。例如,std::vector是可复制的,而std::unique_ptr和std::thread由于其他原因是不可复制的。 最佳答案 Shouldatypebemove-only,

c++ - 重复 move 已被 move 捕获的 lambda 中的变量

我有以下测试代码:#include#includevoidprintValue(std::string&&val){std::cout我得到结果:Gotvalue:TestValueGotvalue:TestValueGotvalue:TestValue从lambda中move一个已被move捕获的对象将始终具有它被move到lambda中的初始状态是一个有效的假设,或者这只是一个处于“有效但未指定”状态的对象的产物状态”? 最佳答案 std::move不执行move操作;它只是将参数转换为右值。对于您的代码,printValue通