C++ std::move的简写

C++ std::move的简写,c++,operator-overloading,move-semantics,rvalue-reference,perfect-forwarding,C++,Operator Overloading,Move Semantics,Rvalue Reference,Perfect Forwarding,对于某些类S重载一元运算符+(或者对于非指针类类运算符*)是否是一种不好的做法 struct S { S && operator + () & noexcept { return std::move(*this); } }; 它的目标是发明std::move的速记 S a; S b = +a; // instead of S c = std::move(a); 假设我有一个包含大量不同类的项目,它大量使用移动语义。所有的类都不会模仿任何算术对应项。我会反驳这一点,因为

对于某些类
S
重载一元
运算符+
(或者对于非指针类类
运算符*
)是否是一种不好的做法

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

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

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

我会反驳这一点,因为我们没有用C++定义BEGIN{:未来的代码维护者(甚至可能是你)不会立即理解发生了什么


记住,你只写一次代码,读了很多次。
std::move
打字很快,清楚它在做什么,任何知道C++11的人都会知道它的确切含义。

我会反对这一点,因为我们不在C++中定义BEGIN{/code>:未来的代码维护者(甚至可能是你)不会马上明白发生了什么


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

这样做客观上是一种不好的做法。
std::move()
是一种标准的、被广泛理解的转换为右值的方法(特别是xvalue)。任何看到
std::move(a)
的人要么确切知道它的功能,要么根本不懂移动语义(如果他们不懂,
std::move
很容易在谷歌上了解)


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

这样做客观上是不好的做法。
std::move()
是一种标准的、易于理解的转换为右值(特别是xvalue)的方法。任何看到
std::move(a)
的人都知道它的确切功能,或者根本不理解移动语义(如果他们不知道,
std::move
很容易在谷歌上了解)


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

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

运算符重载的目的是使程序更易于读取写入,以及理解

+a;
输入的字符更少,仅此而已。您需要每次查找它以理解其含义,并且阅读它时根本不清楚(
++a
++a
-+a
?)


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

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

运算符重载的目的是使程序更易于读取写入,以及理解

+a;
输入的字符更少,仅此而已。您需要每次查找它以理解其含义,并且阅读它时根本不清楚(
++a
++a
-+a
?)


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

我认为最好只输入
std::move
-至少每个人都清楚发生了什么。这使维护变得容易多了。我讨厌读它。
std::move
毕竟没那么长。写代码比读代码容易得多。我不要这样做。这只会给你的源代码增加混乱(哦,这个变量的类型是什么,它是使用
+
move操作符的类型之一?)。如果你想缩短
std::move
,那么使用
using std::move;
,至少你有
move(a)
对任何维护你的代码的人来说都是极不公平的,包括你自己。我想
将_value_category_设置为_xvalue
()是完全不可能的。:-)我认为最好只输入
std::move
——至少大家都清楚发生了什么。这会让维护变得更容易。我不想读这篇文章。
std::move
毕竟不会太长。而且写代码比读代码容易得多。我不会这么做。这只会让你的源代码更加混乱(哦,这个变量的类型是什么?它是使用
+
move运算符的类型之一吗?)。如果您想缩短
std::move
,那么使用
using std::move;
,至少您有
move(a)
对任何维护你的代码的人来说都是极不公平的,包括你自己。我想
将“值”设置为“类别”是完全不可能的。:-“
开始”
甚至没有任何速记的概念-更多的是字符:)嗯,
BEGIN
甚至没有任何速记的概念——更多的是字符:)IDE通常不能