【问题标题】:C++: For which objects, being "moved" implies more than "staying valid"? [duplicate]C++:对于哪些对象,“移动”不仅仅意味着“保持有效”? [复制]
【发布时间】:2017-04-29 15:21:15
【问题描述】:

鉴于ab 的类型为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.

基本类型和可简单复制的对象

移动的对象应该保持不变。我正在寻找标准中的确认...

其他类型

至少一个类的程序员应该确保这个类的对象在被移动后是可破坏的!

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2015-03-19
    • 2015-06-18
    • 2012-01-15
    相关资源
    最近更新 更多