【问题标题】:C++: For which objects, being "moved" implies more than "staying valid"? [duplicate]C++:对于哪些对象,“移动”不仅仅意味着“保持有效”? [复制]
【发布时间】:2017-04-29 15:21:15
【问题描述】:
鉴于a 和b 的类型为T,并且我们有移动构造(T b(move(a));)或移动赋值(b = move(a))。在什么情况下我们知道a 的值是多少?
我唯一确定的是unique_ptr,其中a 将成为一个空指针。对于shared_ptr,这是否也有保证?有没有其他类的标准保证已知值?
【问题讨论】:
标签:
c++11
shared-ptr
move-semantics
c++-standard-library
【解决方案1】:
标准库类型
根据标准 N4296,§17.6.3.1,让我们 rv 成为 T 类型的右值,
在表 20、MoveConstructible 要求和表 22 MoveAssignable 要求中。
操作后:
T(rv);
T u =rv;
u = rv;
rv 的状态未指定 [注意:rv 必须仍然满足使用它的库组件的要求。这些要求中列出的操作必须按规定工作
rv 是否已被移出。 ——尾注]
这意味着至少您移动的对象仍然处于有效状态,并且可以用作其类型的任何对象。但作为图书馆范围内的要求,不需要更多。您必须阅读特定的文档。
对于 shared_ptr 特别是:
shared_ptr(shared_ptr&& r) noexcept;
template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
备注:除非 Y* 是可转换的,否则第二个构造函数不得参与重载决议
到 T*。
效果:从 r 移动构造一个 shared_ptr 实例。
后置条件:*this 应包含 r 的旧值。 r 应为空。 r.get() == nullptr.
基本类型和可简单复制的对象
移动的对象应该保持不变。我正在寻找标准中的确认...
其他类型
至少一个类的程序员应该确保这个类的对象在被移动后是可破坏的!