gpt4 book ai didi

赋值左侧和右侧的 C++ 相同变量

转载 作者:行者123 更新时间:2023-12-05 01:03:55 26 4
gpt4 key购买 nike

假设我们有一些对象,例如 std::vector<int> foo .

我通过阅读关于自赋值的 C++ 文档知道 foo = foo (虽然很奇怪)技术上应该没问题,因为 C++ 中的类负责自赋值安全。

但是,假设我也有一些方法reverse() 修改输入,而是返回一个 new vector ,它是给定参数的反转版本。然后我执行:

foo = reverse(foo);

这样可以吗?我读了一个关于序列点之类的东西的非常深的兔子洞,TBH我的大脑现在有点炸了——有人能在这里提供更直接的解释吗?我知道x = x + 5在哪里 xint 类型显然很好,但我想知道当我们处理分配内存的对象时这会如何变化。

另外,假设我们有另一个方法reverseMutate() 确实改变输入,然后返回那个反向(突变)的原始 vector 。我更不清楚是否

foo = reverseMutate(foo);

是定义的行为。

非常感谢您的帮助!我保证我已经尝试过深入研究 C++ 文档,并且我只是在寻找一个不会让我的大脑受伤的更直接的解释......

最佳答案

在这两个方面都是。一切都很安全。

foo = reverse(foo);

如果 reverse 不会变异 foo ,然后它返回一个完全不相关的 vector ,那个 vector 被赋值给foo .这两个步骤按此顺序发生。 reverse 的结果必须在 operator= 之前完全知道曾经被叫到 foo ,出于同样的原因,如果我们这样做 bar(baz(1)) , baz调用必须完全终止之前 bar曾经被调用过。

foo = reverseMutate(foo);

这个更令人兴奋一些,但仍然很好。如果 reverseMutate(foo)变异 foo然后返回它(即字面意义上的 return *this; 作为 std::vector<int>& ),然后它的行为与

reverseMutate(foo);
foo = foo;

即这只是变相的自赋值,正如您已经正确指出的那样,C++ 类负责处理这种情况。

关于赋值左侧和右侧的 C++ 相同变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73144358/

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