Shorthand for std::move
Shorthand for std::move
对于某些类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
,因为它易于阅读、编写和理解。
- Usages of std::move
- 在C++中对T*类型执行std::move的意外行为
- 关于std::move的使用,是否有编译警告
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 通过实例理解std::move及其目的
- 返回一个带有 std::move 的对象并链接函数
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- 为什么当我为 for(auto& it : myUnorderedMap) {... = std::move(it.second)} 时,我会得到一个 const 引用?
- std::move a const std::vector in a lambda capture
- "std::forward"和"std::move"真的不生成代码吗?
- std::vector move 而不是交换到空 vector 并释放存储
- 是否有必要使用 std::move?这不是已经是一个右值参考了吗?
- 如何在没有 std::move 的情况下移动临时对象
- 关于在成员重载中使用 std::move() 的问题
- 显式清除 std::move 之后的源资源
- std::move(key) 同时迭代unordered_map<字符串,字符串>?
- std::move(std::array) g++ vs visual-c++
- 使用 move std::string 的 .data() 成员不适用于小字符串?
- std::move(std::unique_ptr()) 组合是否有标准缩写