C++:关于使用 Stroustrup 示例移动构造函数/赋值的问题
C++: question about move constructor/assignment using Stroustrup example
我理解右值如何调用移动构造函数和移动赋值运算符,但是我很困惑为什么下面 Stroustrup 示例中用于移动赋值的相同代码不用于移动构造函数。 本文摘自第 4 版第 379 页修订的勘误表C++。
由于类中的所有对象都在移动构造函数中复制,为什么移动构造函数不能像移动赋值运算符那样简单地交换对象的指针?
也许我错过了一些东西,感谢您的指导!
template<typename T, typename A = allocator<T>>
struct vector_base { // memory structure for vector
A alloc; // allocator
T* elem; // start of allocation
T* space; // end of element sequence, start of space allocated for possible expansion
T* last; // end of allocated space
vector_base(const A& a, typename A::size_type n, typename A::size_type m =0)
: alloc{a}, elem{alloc.allocate(n+m)}, space{elem+n}, last{elem+n+m} { }
~vector_base() { alloc.deallocate(elem,last-elem); }
vector_base(const vector_base&) = delete; // no copy operations
vector_base& operator=(const vector_base&) = delete;
vector_base(vector_base&&); // move operations
vector_base& operator=(vector_base&&);
};
template<typename T, typename A>
vector_base<T,A>::vector_base(vector_base&& a)
: alloc{a.alloc},
elem{a.elem},
space{a.space},
last{a.last}
{
a.elem = a.space = a.last = nullptr; // no longer owns any memory
}
template<typename T, typename A>
vector_base<T,A>& vector_base<T,A>::operator=(vector_base&& a)
{
swap(*this,a);
return *this;
}
移动构造函数无法执行交换,因为它的成员未初始化,析构函数将无法在传递的右值上正常工作。因此,移动构造函数必须逐个复制每个元素,并将右值的成员设置为 null,以便右值析构函数将起作用。移动赋值可以与右值进行交换,因为当调用右值析构函数时,数据将是有效的(并且是来自潜在右值的常规构造函数的数据(。
相关文章:
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 为用户定义的类正确调用复制构造函数/赋值运算符
- C++:关于使用 Stroustrup 示例移动构造函数/赋值的问题
- 初始值设定项列表与构造函数赋值与变量定义
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- 创建一个类并在C++中使用构造函数(赋值)
- 如何为具有自引用指针的类实现复制构造函数/赋值运算符
- 使typedef的构造函数/赋值运算符成为友元函数
- 复制构造函数+赋值运算符
- C++ 矢量从构造函数赋值对象,无需临时
- 具有std::原子成员变量的类的复制构造函数/赋值运算符出错
- 初始化对象时复制构造函数/赋值运算符混淆
- 默认情况下是默认的构造函数/赋值noexcept/constexpr
- 模板是否应该为不同类型的参数制作非 Rvalue 引用构造函数/赋值
- 为什么 std 类型不提供来自分配器不同源的转换构造函数/赋值
- 是否为派生类生成的移动构造函数/赋值运算符
- 复制构造函数/赋值运算符
- C++复制构造函数/赋值运算符错误
- 正在获取要使用的移动构造函数/赋值运算符
- 影响正确性的move构造函数/赋值操作符示例