gpt4 book ai didi

c++ - 交换和 move 无限递归

转载 作者:太空宇宙 更新时间:2023-11-03 10:38:08 24 4
gpt4 key购买 nike

我有一个非常简单的示例类,用 C++17 编译。

#include <string>
#include <iostream>

struct name {
std::string first, middle, last;
name() = default;
name(name const&) = default;
name(name &&) = default;

name& operator=(name o) {
std::swap(*this, o); // bad!
return *this;
}
};
int main() {
name n1{"mr", "john", "smith"};
name n2 = std::move(n1);
name n3 = n2;

std::cout << n3.first << " " << n3.middle << " " << n3.last;
}

使用这种值语义,捆绑 move 赋值,我故意调用合格的交换,而不是 using std::swap;交换(*这个,o);。反正我没有提供交换。考虑到 STL 将交换实现为一个 move 构造和一系列 move 分配,我认为这个实现将无限递归,交换调用 move 和 move 调用交换。 std::swap 是否更改为成员交换或类似的东西?

最佳答案

您从未调用过operator=;你所有的代码都在使用 initialization (调用构造函数),特别是 copy initialization ,而不是赋值(调用 operator=)。

将代码更改为:

name n1{"mr", "john", "smith"};
name n2, n3;

n2 = std::move(n1);
n3 = n2;

您会看到您的 operator= 已被使用(并且可能会爆炸)。

关于c++ - 交换和 move 无限递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55859223/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com