1

可能重复:
在 C++11 中,什么构成了“已移出”对象的有效状态?

考虑这样的事情:

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

这样做是否合法:

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

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

v.pop_back();  

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

在我的真实情况下,我有std::vector<std::vector<Foo>>并且用它做一些事情。
但我不知道从外部仍然使用的std::move()a是否合法。std::vectorstd::vector

4

1 回答 1

2

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

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

于 2012-08-25T18:12:41.430 回答