gpt4 book ai didi

c++ - move 语义和运算符重载

转载 作者:可可西里 更新时间:2023-11-01 17:13:26 25 4
gpt4 key购买 nike

这与 this answer 有关由 Matthieu M. 提供,介绍如何通过 + 运算符重载使用 move 语义(通常,运算符不会直接重新分配回左参数)。

他建议实现三个不同的重载:

inline T operator+(T left, T const& right) { left += right; return left; }
inline T operator+(T const& left, T right) { right += left; return right; } // commutative
inline T operator+(T left, T&& right) { left += right; return left; } // disambiguation

数字 1 和 3 有道理,但我不明白 2 的目的是什么。评论建议交换处理,但似乎 1 和 2 是相互排斥的(即在模棱两可的情况下实现这两个结果)

例如,实现所有 3 个:

T a, b, c;
c = a + b;

编译器输出:

1>          error C2593: 'operator +' is ambiguous1>          could be 'T operator +(const T &,T)'1>          or       'T operator +(T,const T &)'1>          while trying to match the argument list '(T, T)'

删除 1 或 2,程序将按预期运行。由于 1 是一般情况,而 2 仅适用于交换运算符,因此我不明白为什么会使用 2。有什么我想念的吗?

最佳答案

我认为您没有遗漏任何东西——您问题中的代码确实很麻烦。他回答的前半部分是有道理的,但在“四个期望的案例”和实际示例之间丢失了一些东西。

这可能会更好:

inline T operator+(T left, T const& right) { left += right; return left; }
inline T operator+(const T& left, T&& right) { right += left; return right; }

这实现了规则:制作 LHS 的拷贝(最好通过 move 构造),除非 RHS 无论如何都会过期,在这种情况下就地修改它。

对于非交换运算符,省略第二个重载,或者提供不委托(delegate)复合赋值的实现。

如果您的类内部嵌入了重量级资源(因此无法有效 move ),您将希望避免按值传递。丹尼尔在他的回答中提出了一些很好的观点。但是不要像他建议的那样返回 T&&,因为那是一个悬空引用。

关于c++ - move 语义和运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16136461/

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