c++ - std::move 的简写

标签 c++ operator-overloading move-semantics rvalue-reference perfect-forwarding

<分区>

对于某些类 S 来说,重载一元 operator + 是否是一种不好的做法?类)如下?

struct S { S && operator + () & noexcept { return std::move(*this); } };

它的目标是为 std::move 发明速记。

S a;
S b = +a;
// instead of
S c = std::move(a);

假设我有一个包含大量不同类的项目,该项目大量使用 move 语义。所有类都不模仿任何算术对应物。

最佳答案

做这样的事情客观上是不好的做法。 std::move() 是标准提供的、易于理解的转换为右值(特别是 xvalue)的方法。任何看到 std::move(a) 的人要么确切地知道它的作用 - 或者根本不理解 move 语义(如果他们不理解,std::move 很容易通过 Google 了解)。

看到+a没有任何意义,不用先查。更糟糕的是,一元 + 对许多类型的作用具有预期的意义——这与 move 语义无关! (例如,a 是一个 char 被提升为 int 吗?它是一个无捕获的 lambda 被转换为一个函数指针吗?)节省 10 个字符?更不用说您必须为每种类型实现此 operator+,而且您根本不必实现 std::move()。这是一个非常糟糕的权衡。

关于c++ - std::move 的简写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36041662/

相关文章:

c++ - 为什么将对象传递给函数时不调用复制构造函数

c++ - 为什么当我传递对此函数的引用时它不起作用?

c++ - 比较/复制坐标结构;重载

c++ - 不可能的隐式 move 操作?

c++ - 在没有赋值的情况下调用 std::move() 时会发生什么

c++ - 在 CLion 中包含 llvm 库的正确方法是什么?

c++ - 按位运算符 ">>"和 "<<"?

c++ - 为嵌套结构/类重载流插入运算符

c# - 在自定义 C# 类型中实现数学函数?

c++ - 在 C++ 中,对具有唯一 ID 的对象进行复制/move/分配的正确方法是什么?