【问题标题】:Is the state of any standard class after being moved specified?是否指定了移动后的任何标准类的状态?
【发布时间】:2011-12-15 15:46:43
【问题描述】:

如果我moveshared_ptr'a'变成shared_ptr'b'是'a'保证为空?

是否指定了any标准类移动后的状态?

【问题讨论】:

    标签: c++ c++11 shared-ptr


    【解决方案1】:

    如果指定,它在它们的构造函数和(如果可分配的)赋值运算符子条款下。对于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 适用。

    【讨论】:

    • @Matthieu :听起来您需要 TCO。 ;-]
    【解决方案2】:

    一般 17.6.5.15/1 适用:

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

    因此你可以调用任何不需要前置条件的函数。

    如果指定,what @Xeo said 将适用。

    【讨论】:

    • 我交叉引用了我们的答案,我们都添加了完整答案的一部分。 :)
    • 移动后最好让旧对象超出范围或在重新使用之前明确重新初始化它。依赖没有前置条件的方法会成为维护问题(拿着斧头的人说)。
    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2020-09-30
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多