对于某些类PersistentActor
来说,将一元S
(或非类似指针类的operator +
)重载为以下是不好的做法?
operator *
目标是为struct S { S && operator + () & noexcept { return std::move(*this); } };
发明速记。
std::move
假设我有一个包含大量不同类的项目,它集中使用了移动语义。所有类都不模仿任何算术对应物。
答案 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
,因为它易于阅读,书写和理解。