【问题标题】:What exactly is required of an xvalue that has been moved from? [duplicate]已被移出的 xvalue 究竟需要什么? [复制]
【发布时间】:2012-08-25 18:05:08
【问题描述】:

可能重复:
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&lt;std::vector&lt;Foo&gt;&gt; 并用它做一些事情。
但我不知道外部std::vector 仍在使用的std::vector 中的std::move() 是否合法。

【问题讨论】:

  • 感谢参考

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


【解决方案1】:

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

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

【讨论】:

  • 好的!谢谢 :) 虽然我很想在标准深处的某个地方找到它,但我相信你。这是常识应该告诉我们的;)
  • @iolo,见 17.3.26 [defns.valid] 和 17.6.5.15 [lib.types.movedfrom]
猜你喜欢
  • 2019-01-24
  • 2017-12-16
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2019-03-06
  • 2020-02-26
  • 2016-08-10
  • 2011-06-24
相关资源
最近更新 更多