为什么在处理临时变量时,std::swap 优先于 std::move?[关闭]

Why is std::swap preferred over std::move when dealing with temporaries? [closed]

提问人:The Dreams Wind 提问时间:7/26/2022 最后编辑:The Dreams Wind 更新时间:7/26/2022 访问量:1055

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

去年关闭。

通读复制赋值运算符的参考,我注意到当涉及到运算符签名的第一个选项时,它建议复制和交换习语

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;
}
C++ 移动语义 和交换

评论

2赞 Sam Varshavchik 7/26/2022
搬家不是交换。如果析构函数 ,猜猜结果是什么?现在,您有两个具有相同指针的对象(以及顶部的樱桃内存泄漏)。祝你的破坏者任务好运。搬家不是交换,无论它有什么属性。Tdeletem_ArraymArray = std::move(other.mArray);mArray
1赞 The Dreams Wind 7/26/2022
@SamVarshavchik公平的观点,但让我们假设它不是一个数组,而只是 .(这实际上是类在第一个链接下的结构,它有 和 成员)std::stringintstd::string
2赞 Caleth 7/26/2022
@TheDreamsWind,如果移动分配每个成员是正确的,则不应该为类编写 ,因为这是默认的。operator=
1赞 The Dreams Wind 7/26/2022
@SamVarshavchik但是基于移动的吗?此外,我不太理解为什么第二个示例会导致额外的分配/取消分配,如果我们将其与通过合同引入额外临时性进行比较std::swapstd::swap
2赞 krisz 7/26/2022
类似的问题: c++ - Copy & Move Idiom? - Stack Overflow

答: 暂无答案