【发布时间】:2016-12-13 00:09:38
【问题描述】:
在 C++11 之前,复制赋值运算符始终应通过 const 引用传递,如下所示:
template <typename T>
ArrayStack<T>& operator= (const ArrayStack& other);
然而,随着移动赋值运算符和构造函数的引入,似乎有些人提倡使用按值传递来代替复制赋值。还需要添加一个移动赋值运算符:
template <typename T>
ArrayStack<T>& operator= (ArrayStack other);
ArrayStack<T>& operator= (ArrayStack&& other);
上面2个算子的实现是这样的:
template <typename T>
ArrayStack<T>& ArrayStack<T>::operator =(ArrayStack other)
{
ArrayStack tmp(other);
swap(*this, tmp);
return *this;
}
template <typename T>
ArrayStack<T>& ArrayStack<T>::operator =(ArrayStack&& other)
{
swap(*this, other);
return *this;
}
在为 C++11 以后创建复制赋值运算符时使用按值传递是个好主意吗?什么情况下应该这样做?
【问题讨论】:
-
operator=(ArrayStack)没有理由创建副本tmp。 -
按值传递的版本可以同时进行移动和复制赋值,通常通过复制和交换。
标签: c++ c++11 move-semantics assignment-operator