Shorthand 对于 std::move

Shorthand for std::move

对于某些 class S 重载一元 operator + 是否是一种不好的做法(或者 operator * 对于类非指针 class es) 如下?

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

它为 std::move 发明 shorthand 的目标。

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

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

出于与我们在 C++ 中不 #define BEGIN { 相同的原因,我反对这一点:未来的代码维护者(甚至可能是 )不会马上明白是怎么回事。

请记住,您编写一次代码并多次阅读。 std::move 打字很快,一目了然,了解 C++11 的人都知道它的确切含义。

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

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

正如 Scott Meyers 在 More Effective C++ 的第 7 项中所述:

The purpose of operator overloading is to make programs easier to read, write, and understand

+a; 是要输入的字符更少,而且...仅此而已。每次都需要查一下才明白意思,读起来一点都不清楚(+ +a, ++a, - +a ?).

使用std::move,因为它易于阅读、书写和理解。