指定移动后是否为任何标准类的状态?

Dav*_*vid 9 c++ shared-ptr c++11

如果我move shared_ptr'进shared_ptr''b'是'a'保证为空?

指定移动后是否为任何标准类的状态?

Xeo*_*Xeo 13

如果指定,则在它们的构造函数和(如果可赋值)赋值运算符子条款下.因为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;
Run Code Online (Sandbox Code Playgroud)

p20 备注:第二个构造函数不得参与重载决策,除非Y*可以转换为T*.
p21 效果:移动构造shared_ptr实例r.
p22 后置条件: *this应包含旧值r.r应该是空的.r.get() == 0.

赋值运算符shared_ptr基本上通过copy-and-swap描述,并使用(如果是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;
Run Code Online (Sandbox Code Playgroud)

p4 效果:相当于shared_ptr(std::move(r)).swap(*this).
p5 返回: *this.

如果没有指定,@ AProgrammer说的适用.

  • 在这篇文章的引用后,我陷入了堆栈溢出... (4认同)
  • @Matthieu:听起来你需要TCO.; - ] (2认同)

APr*_*mer 12

一般情况下,17.6.5.15/1适用:

可以从(12.8)移动C++标准库中定义的类型的对象.可以显式指定或隐式生成移动操作.除非另有规定,否则此类移动物体应置于有效但未指定的状态.

因此,您可以调用任何不需要前提条件的函数.

如果指定,@ Xeo表示适用.