首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用.clear()、.shrink_to_fit()、.empty()是否合法?

调用.clear()、.shrink_to_fit()、.empty()是否合法?
EN

Stack Overflow用户
提问于 2018-04-08 22:59:24
回答 3查看 460关注 0票数 2

作为这两个问题的一个具体子案例:

Is a moved-from vector always empty?

What can I do with a moved-from object?

有人想知道:在给.clear().chrink_to_fit().empty()分配新的向量之前,在移动std::vector上调用它是否合法?我可以询问push_back(),但我不知道这会产生什么结果,因为依赖移动向量是空的是不安全的。

清楚的是,破坏以及新载体的分配是合法的。

代码语言:javascript
复制
std::vector<int> fs = getVec();
giveVecs(std::move(fs));
fs.empty();  // 1.?
fs.size();   // 2.?
fs.shrink_to_fit(); // 3.?
fs.clear(); // //4. ?
fs = {} ; // 5. Should be fine, but weird when we have .clear()
fs.push_back(1); // 

编辑:

我应该澄清,有些操作确实有先决条件:因此,(正如您在其他问题中所读到的),并非所有操作在移动后都是合法的。

因此,我的问题可以这样说:这三项行动中的任何一项是否有任何先决条件?问题的一个根源可能是与移出对象的分配器相关的精细打印。

EN

回答 3

Stack Overflow用户

发布于 2018-04-08 23:02:46

是。移动对象使其处于未指定但有效的状态。

所以你可以叫clearshrink_to_fitemptypush_back等等。

但是,由于未指定的限定符:),您可能应该从clear开始。

票数 6
EN

Stack Overflow用户

发布于 2018-04-10 20:00:24

合法但未指定的状态可能是真正的空(使用内部缓冲区移动);它可能是移动到容器的内容(使用交换),它可能仍然具有从移动到容器的内存;但是所有的元素都被破坏了,而size()报告为零(swap & clear())。

或者,它可能是我没有想到的任何其他事情,但它们都应该看起来像容器的有效状态。

票数 0
EN

Stack Overflow用户

发布于 2018-04-08 23:04:43

移动对象处于有效但未指定的状态。通过谷歌的魔力,该标准的相关部分为17.6.5.15 lib.types.movedfrom

C++标准库中定义的类型对象可以从(12.8)中移出。移动操作可以显式指定或隐式生成。除非另有规定,否则移出的物体应置于有效但未指定的状态。

至于moved std::vector是合法的,这可能取决于其他函数对它做了什么。我的预感是,在大多数实现中,您几乎可以完成任何您想做的事情,但我不相信这在任何地方都是有保证的。有可能所有成员函数都会失败(有效可能意味着它们不会崩溃,但对象实际上仍然是无用的)。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49723585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档