草庐IT

c++ - 添加 move 构造函数会破坏二进制兼容性吗?

如果我将一个move构造函数(或move赋值运算符)添加到我的库中,我会破坏二进制兼容性吗?这种添加会以任何方式破坏用户的代码吗?classFoo{public:Foo();Foo(Fooconst&);Foo&operator=(Fooconst&);//newmethods:Foo(Foo&&);Foo&operator=(Foo&&);}; 最佳答案 在我看来,只要您不添加成员或虚函数,就不会对二进制兼容性产生任何影响,因为对象的布局不会改变。如果一个组件(比如共享库,Windows上的.dll或Linux上的.so)使用旧版

c++ - 堆栈可以有一个异常安全的方法来返回和删除具有 move 语义的顶部元素吗?

在对关于std::stack::pop()的问题的回答中Iclaimedpop不返回值的原因是出于异常安全原因(如果复制构造函数抛出会发生什么)。@Konrad评论说现在有了move语义,这不再相关。这是真的吗?据我所知,move构造函数canthrow,但也许与noexcept它仍然可以实现。对于奖励积分,此操作可以提供哪些线程安全保证? 最佳答案 当然,并非所有类型都支持move,C++0x甚至允许抛出move构造函数。只要从右值构造对象可能会抛出它就不可能是异常安全的。但是,move语义允许您拥有许多在给定右值源的情况下不可抛

c++ - 使用 move 构造函数抛出异常? (C++)

如果我有一个Error类型的对象e实现了一个move构造函数,将抛出std::move(e)使用将Error的构造函数move到“复制”e,那么它是否避免制作对象的实际拷贝?所以如果我有Errore;throwstd::move(e);Error的拷贝构造函数会不会被调用?当您的move构造函数是noexcept(它应该是)但您的复制构造函数不是时,这很有趣。 最佳答案 §15.1[except.throw]:Throwinganexceptioncopy-initializes(8.5,12.8)atemporaryobject,

c++ - 在 C++ 中将通用构造函数分配给成员变量时的 std::move 或 std::forward

考虑以下类foo1和foo2templatestructfoo1{Tt_;foo1(T&&t):t_{std::move(t)}{}};templatestructfoo2{foo1t_;foo2(T&&t):t_{std::forward(t)}{}};foo1的构造函数总是这样吗?表示初始化成员变量的正确方式T?即通过使用std::move.foo2的构造函数总是这样吗?表示初始化成员变量的正确方式foo1由于需要转发给foo1的构造函数?即通过使用std::forward.更新以下示例因foo1而失败使用std::move:templatefoo1make_foo1(T&&t){

c++ - std::move 之后的僵尸对象

我对使用C++0xmove语义move对象之后的状态感到困惑。我的理解是,一旦一个对象被move,它仍然是一个有效的对象,但它的内部状态已经改变,因此当它的析构函数被调用时,没有资源被释放。但如果我的理解是正确的,move对象的析构函数应该仍然被调用。但是,当我执行一个简单的测试时,这并没有发生:structFoo{Foo(){s=newchar[100];cout这个输出:Constructorcalled!Doingsomething...Destructorcalled!注意析构函数只被调用一次。这表明我对这里的理解是错误的。为什么析构函数没有被调用两次?以下是我对应该发生的事情

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是