鉴于a
和b
的类型为T
,我们可以移动构造(T b(move(a));
)或移动分配(b = move(a)
)。在什么情况下,我们知道a
的价值是什么?
我唯一知道的是unique_ptr
,其中a
将成为空指针。 shared_ptr
也保证这一点吗?是否有标准保证已知值的其他类?
答案 0 :(得分:1)
标准库类型
从标准N4296,§17.6.3.1开始,让rv
为T
类型的右值,
在表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。
基本类型和平凡的可复制文件
移动的对象应该保持不变。我正在寻找标准中的确认......
其他类型
至少一个类的程序员应确保该类的一个对象在被移动后是可破坏的!