Shorthand for std::move

Shorthand for std::move

本文关键字:move std for Shorthand      更新时间:2023-10-16

对于某些类S来说,重载一元operator +(或者operator *对于非类似指针的类)是一种不好的做法吗?

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

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

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

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

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

看到+a没有任何意义,而不必先查找它。更糟糕的是,一元+对许多类型的作用是有预期含义的 - 这与移动语义无关!(例如,a是晋升为int char吗?是否将无捕获 lambda 转换为函数指针?全部只需保存 10 个字符?更不用说您必须为每种类型实现此operator+,并且根本不需要实现std::move()。这是一个非常糟糕的权衡。

我会反对这一点,原因与我们C++中没有#define BEGIN {的原因相同:未来的代码维护者(甚至可能是)不会立即理解发生了什么。

请记住,您编写一次代码并多次阅读。 std::move打字的速度非常快,清楚地知道它在做什么,任何知道C++11的人都会确切地知道它的含义。

正如斯科特·迈耶斯(Scott Meyers)在更有效C++的第7项中所说:

运算符重载的目的是使程序更易于阅读编写理解

+a;是要键入的字符更少,并且...就是这样。你需要每次都查一下才能理解它的含义,读起来根本不清楚(+ +a++a- +a

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