std :: move构造后的对象状态

时间:2010-12-24 01:08:14

标签: c++11 move-semantics

在一个只能被销毁的状态下,为了移动构造而移动一个对象是合法/正确的c ++ 0x吗?例如:

class move_constructible {...};

int main()
{
    move_constructible x;
    move_constructible y(std::move(x));
    // From now on, x can only be destroyed. Any other method will result
    // in a fatal error.
}

为了记录,我试图在c ++类中包含一个带有指针成员的c结构,该指针成员总是应该指向一些已分配的内存区域。所有c库API都依赖于这个假设。但是这个要求阻止了写一个真正廉价的移动构造函数,因为为了使x在移动后保持有效的对象,它将需要它自己分配的内存区域。我以这样的方式编写了析构函数,它在从c API调用相应的清理函数之前首先检查NULL指针,这样至少可以在移动后安全地销毁该结构。

1 个答案:

答案 0 :(得分:3)

是的,语言允许这样做。实际上,这是移动语义的目的之一。但是,您有责任确保不会调用其他方法和/或提供适当的诊断。注意,通常您也可以使用至少赋值运算符来“恢复”您的变量,例如在交换两个值的经典示例中。

另见this question