【发布时间】:2017-09-10 23:34:12
【问题描述】:
是否有一个 STL 容器(无 Boost)可以从中移除元素并将其移动到左值?
假设我有一个大对象 std::vector 和一个变量,我想从向量中弹出一个元素。
var = vec.back(); // non-move assign op
vec.pop_back(); // dtor
var = containerWithMovePop.pop_and_return(); // move assign-op
性能并不是那么重要,我只是想知道是否可行。
【问题讨论】:
-
为什么不
var = std::move(vec.back()); vec.pop_back();? -
好的,但是
vec.back()在这两个操作之间会处于什么状态?我会说无效,对吗? -
它将处于“移出”状态。这种状态是否有效,取决于类型是如何实现的,但所有标准类型都处于“有效但未指定”状态,这通常也推荐用于用户定义的类型。
-
@boofaz:
move需要使对象处于至少在某种程度上有效的状态,因此您仍然可以(至少)销毁它,这就是您所做的一切这里。我相信你应该没问题,只要你不尝试在 move 和 pop_back 之间交叉使用向量数据的任何其他用途。 -
并且任何类型在移出时都应该至少是可破坏的,并且您不需要任何其他内容。
标签: c++ stl containers move-semantics