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

C++ 是否指定了移动后任何标准类的状态?,c++,c++11,shared-ptr,C++,C++11,Shared Ptr,如果我将共享\u ptr移动到共享\u ptr中,则“b”是否保证为空 是否指定了任何标准类在移动后的状态?如果指定,则在其构造函数和(如果可赋值)赋值运算符子类下。对于shared\u ptr我们有: §20.7.2.2.1[util.smartptr.shared.const] shared_ptr(shared_ptr&& r) noexcept; template<class Y> shared_ptr(shared_ptr<Y>&&

如果我
共享\u ptr
移动到
共享\u ptr
中,则“b”是否保证为空


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

如果指定,则在其构造函数和(如果可赋值)赋值运算符子类下。对于
shared\u 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;
p4效果:相当于
shared_ptr(std::move(r)).swap(*this)

p5返回:
*此


如果未指定,则适用。

一般来说,17.6.5.15/1适用于:

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

因此,您可以调用任何不需要先决条件的函数


如果指定,则适用。

我交叉引用了我们的答案,我们都添加了完整答案的一部分。:)移动之后,最好让旧对象脱离范围,或者在重新使用之前显式地重新初始化它。依靠一种没有先决条件的方法将成为一个维护问题(拿着斧头的人说)。@Matthieu:听起来你需要TCO;-]
shared_ptr& operator=(shared_ptr&& r) noexcept;
template<class Y> shared_ptr& operator=(shared_ptr<Y>&& r) noexcept;