标准是否明确定义了对象从移动后可以做什么?我曾经认为,你只能销毁一个已经移动的对象,但这是不够的。
例如,考虑标准库中定义的函数模板swap
:
template <typename T>
void swap(T& a, T& b)
{
T c = std::move(a); // line 1
a = std::move(b); // line 2: assignment to moved-from object!
b = std::move(c); // line 3: assignment to moved-from object!
}
显然,必须能够对已移动的对象进行赋值操作,否则第2行和第3行将失败。那么我还能用移动后的对象做什么呢?在标准中我应该从哪里找到这些详细信息呢?
(顺便问一下,为什么第1行是T c = std::move(a);
而不是T c(std::move(a));
?)
char * buffer;
和int length;
成员的字符串,那么我的移动构造函数/赋值必须交换(或设置)两者的值?或者,如果未指定长度(即empty
和size
返回无意义的值),是否可以? - UncleBens