移动的xvalue究竟需要什么?

时间:2012-08-25 18:05:09

标签: c++ c++11 move-semantics

  

可能重复:
  What constitutes a valid state for a “moved from” object in C++11?

考虑这样的事情:

class Foo {};  
std::vector<Foo> v( 5 );

执行以下操作是否合法:

v.front() = std::move( v.back() );  

前提是我事后做了这样的事情:

v.pop_back();  

更准确地说,我想知道经过std::move()语义的xvalue需要什么。
我知道它需要是可以破坏的(显然)。还有别的吗?假设我会调用std::vector::insert()或其他一些函数,这可能会在幕后复制/移动std::move() ed值。
那还合法吗?

在我的实际案例中,我有std::vector<std::vector<Foo>>并做了相同的事情 但是我不知道外部std::move()仍使用std::vector的{​​{1}}是否合法。

1 个答案:

答案 0 :(得分:2)

是的,这是有效的:您始终可以销毁移动的对象。 (我无法找到 - 或者是否 - 这是在C ++语言标准中指定的,但如果移动的对象无法销毁,我相信我们都会认为这是一个错误。)因为你的代码只有破坏移动的对象,你的代码很好。

标准库对移动对象的状态提出了额外要求,并且实例化标准库组件的任何类型都必须遵循这些附加规则。要点是,对类型的非移动对象有效的移动和复制操作也必须对移动的类型对象有效。因此,例如,在移动最后一个元素之后,您可以为该元素分配一个新值:v.back() = Foo();