【发布时间】:2011-12-15 15:46:43
【问题描述】:
如果我moveshared_ptr'a'变成shared_ptr'b'是'a'保证为空?
是否指定了any标准类移动后的状态?
【问题讨论】:
标签: c++ c++11 shared-ptr
如果我moveshared_ptr'a'变成shared_ptr'b'是'a'保证为空?
是否指定了any标准类移动后的状态?
【问题讨论】:
标签: c++ c++11 shared-ptr
如果指定,它在它们的构造函数和(如果可分配的)赋值运算符子条款下。对于shared_ptr,我们有:
§20.7.2.2.1 [util.smartptr.shared.const]
shared_ptr(shared_ptr&& r) noexcept;
template<class Y> shared_ptr(shared_ptr<Y>&& r) noexcept;
p20 备注: 除非
Y*可转换为T*,否则第二个构造函数不应参与重载决议。
p21 效果: 从r移动构造一个shared_ptr实例。
p22 后置条件:*this应包含r的旧值。r应为空。r.get() == 0.
shared_ptr 的赋值运算符基本上是通过复制和交换来描述的,其中临时构造的 (moved if rvalue) 参数:
§20.7.2.2.3 [util.smartptr.shared.assign]
shared_ptr& operator=(shared_ptr&& r) noexcept;
template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r) noexcept;
p4 效果:相当于
shared_ptr(std::move(r)).swap(*this)。
p5 返回:*this.
如果未指定,what @AProgrammer said 适用。
【讨论】:
一般 17.6.5.15/1 适用:
在 C++ 标准库中定义的类型的对象可以从 (12.8) 中移出。移动操作可以显式指定或隐式生成。除非另有说明,否则此类移出的对象应处于有效但未指定的状态。
因此你可以调用任何不需要前置条件的函数。
如果指定,what @Xeo said 将适用。
【讨论】: