C ++:对于哪些对象,被“移动”意味着不仅仅是“保持有效”?

时间:2016-12-14 10:24:13

标签: c++11 shared-ptr move-semantics c++-standard-library

鉴于ab的类型为T,我们可以移动构造(T b(move(a));)或移动分配(b = move(a))。在什么情况下,我们知道a的价值是什么?

我唯一知道的是unique_ptr,其中a将成为空指针。 shared_ptr也保证这一点吗?是否有标准保证已知值的其他类?

1 个答案:

答案 0 :(得分:1)

标准库类型

从标准N4296,§17.6.3.1开始,让rvT类型的右值, 在表20中,MoveConstructible要求和表22 MoveAssignable要求。

操作后:

T(rv);
T u =rv;
u = rv;
  

rv的状态未指定[注意:rv仍必须满足使用它的库组件的要求。这些要求中列出的操作必须按照规定运行   rv是否已被移动。 - 结束说明]

这意味着至少您移动的对象仍处于有效状态,可以用作其类型的任何对象。但是,作为图书馆的要求,不需要任何其他内容。你必须阅读具体的文件。

对于shared_ptr specificaly:

shared_ptr(shared_ptr&& r) noexcept;
template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
  

备注:除非Y *可转换,否则第二个构造函数不应参与重载决策   到T *。

     

效果:从r构造一个shared_ptr实例。   后置条件:*这应包含r的旧值。 r应为空。 r.get()== nullptr。

基本类型和平凡的可复制文件

移动的对象应该保持不变。我正在寻找标准中的确认......

其他类型

至少一个类的程序员应确保该类的一个对象在被移动后是可破坏的!