Shorthand 对于 std::move
Shorthand for std::move
对于某些 class S
重载一元 operator +
是否是一种不好的做法(或者 operator *
对于类非指针 class es) 如下?
struct S { S && operator + () & noexcept { return std::move(*this); } };
它为 std::move
发明 shorthand 的目标。
S a;
S b = +a;
// instead of
S c = std::move(a);
假设我有一个包含大量不同 classes 的项目,该项目大量使用移动语义。所有 classes 都不模仿任何算术对应物。
出于与我们在 C++ 中不 #define BEGIN {
相同的原因,我反对这一点:未来的代码维护者(甚至可能是 你)不会马上明白是怎么回事。
请记住,您编写一次代码并多次阅读。 std::move
打字很快,一目了然,了解 C++11 的人都知道它的确切含义。
做这样的事情客观上是不好的做法。 std::move()
是标准提供的、易于理解的转换为右值(特别是 xvalue)的方法。任何看到 std::move(a)
的人要么确切地知道它的作用 - 或者根本不理解移动语义(如果他们不理解,std::move
很容易 Google 学习)。
看到+a
没有任何意义,不用先查。更糟糕的是,一元 +
对许多类型的作用具有预期的含义——这与移动语义无关! (例如,a
a char
被提升为 int
了吗?它是一个无捕获 lambda 被转换为函数指针吗?)所有这些只是为了节省 10 个字符?更不用说您必须为每种类型实施此 operator+
,而且您根本不必实施 std::move()
。这是一个非常糟糕的权衡。
正如 Scott Meyers 在 More Effective C++ 的第 7 项中所述:
The purpose of operator overloading is to make programs easier to read, write, and understand
+a;
是要输入的字符更少,而且...仅此而已。每次都需要查一下才明白意思,读起来一点都不清楚(+ +a
, ++a
, - +a
?).
使用std::move
,因为它易于阅读、书写和理解。
对于某些 class S
重载一元 operator +
是否是一种不好的做法(或者 operator *
对于类非指针 class es) 如下?
struct S { S && operator + () & noexcept { return std::move(*this); } };
它为 std::move
发明 shorthand 的目标。
S a;
S b = +a;
// instead of
S c = std::move(a);
假设我有一个包含大量不同 classes 的项目,该项目大量使用移动语义。所有 classes 都不模仿任何算术对应物。
出于与我们在 C++ 中不 #define BEGIN {
相同的原因,我反对这一点:未来的代码维护者(甚至可能是 你)不会马上明白是怎么回事。
请记住,您编写一次代码并多次阅读。 std::move
打字很快,一目了然,了解 C++11 的人都知道它的确切含义。
做这样的事情客观上是不好的做法。 std::move()
是标准提供的、易于理解的转换为右值(特别是 xvalue)的方法。任何看到 std::move(a)
的人要么确切地知道它的作用 - 或者根本不理解移动语义(如果他们不理解,std::move
很容易 Google 学习)。
看到+a
没有任何意义,不用先查。更糟糕的是,一元 +
对许多类型的作用具有预期的含义——这与移动语义无关! (例如,a
a char
被提升为 int
了吗?它是一个无捕获 lambda 被转换为函数指针吗?)所有这些只是为了节省 10 个字符?更不用说您必须为每种类型实施此 operator+
,而且您根本不必实施 std::move()
。这是一个非常糟糕的权衡。
正如 Scott Meyers 在 More Effective C++ 的第 7 项中所述:
The purpose of operator overloading is to make programs easier to read, write, and understand
+a;
是要输入的字符更少,而且...仅此而已。每次都需要查一下才明白意思,读起来一点都不清楚(+ +a
, ++a
, - +a
?).
使用std::move
,因为它易于阅读、书写和理解。