std :: move的简写

时间:2016-03-16 16:35:29

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

对于某些类PersistentActor来说,将一元S(或非类似指针类的operator +)重载为以下是不好的做法?

operator *

目标是为struct S { S && operator + () & noexcept { return std::move(*this); } }; 发明速记。

std::move

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

3 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:9)

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

请记住,您只需编写一次代码并多次阅读。 std::move可以快速输入,清楚它正在做什么,任何了解C ++ 11的人都会知道它的含义。

答案 2 :(得分:8)

正如Scott Meyers在更有效的C ++第7项中所述:

  

运营商重载的目的是使程序更容易阅读编写理解

+a;输入的字符越少,而且......就是这样。你需要每次查找它以理解它的含义并阅读它根本不清楚(+ +a++a- +a?)。

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