提问人:The Dreams Wind 提问时间:7/26/2022 最后编辑:The Dreams Wind 更新时间:7/26/2022 访问量:1055
为什么在处理临时变量时,std::swap 优先于 std::move?[关闭]
Why is std::swap preferred over std::move when dealing with temporaries? [closed]
问:
通读复制赋值运算符的参考,我注意到当涉及到运算符签名的第一个选项时,它建议复制和交换习语:
class-name & class-name :: operator= ( class-name )
稍后在同一页面上,示例实现如下:
A& operator=(A other)
{
std::cout << "copy assignment of A\n";
std::swap(n, other.n);
std::swap(s1, other.s1);
return *this;
}
在这一点上,我开始想知道为什么这个实现是用临时值交换值,而不是将它们移出它?此外,我决定更仔细地检查这个关于复制和交换习语的优秀 SO 答案,并注意到它不仅建议了相同的方法,而且还在另一个代码段中用右值引用交换值(在范围末尾保留原始值也不需要):
dumb_array(dumb_array&& other) noexcept ††
: dumb_array() // initialize via default constructor, C++11 only
{
swap(*this, other);
}
这不是我第一次目睹交换与应该在给定范围结束时被销毁的值一起使用,但是我很难看到与“临时”一起使用有什么好处:std::move
A& operator=(A other)
{
std::cout << "copy assignment of A\n";
n = std::move(other.n);
s1 = std::move(other.s1);
return *this;
}
答: 暂无答案
评论
T
delete
m_Array
mArray = std::move(other.mArray);
mArray
std::string
int
std::string
operator=
std::swap
std::swap