对于某些类 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()
。这是一个非常糟糕的权衡。