C++0x T 运算符+(const T&, T&&) 模式,还需要移动吗?

发布于 2024-11-30 13:49:58 字数 485 浏览 0 评论 0原文

不久前我被告知,实现二元运算符的通常模式需要在返回中进行最后的移动

Matrix operator+(const Matrix &a, Matrix &&b) {
    b += a;
    return std::move(b);
}

但现在有一个特殊的规则,在 return 中,编译器可能会将返回值视为临时值,这样就没有必要了 - 一个简单的 return b 就可以了够了。

但话又说回来,b 在这个函数中有一个名称,因此,它是一个LValue——这会阻碍编译器将其视为一个temp,并且需要 move

最新版本的 C++0x 标准中是否仍然存在这种情况? 我们需要move来实现上述模式?

Some time ago I was told, that the usual pattern to implement two-ary operators needs a final move in the return.

Matrix operator+(const Matrix &a, Matrix &&b) {
    b += a;
    return std::move(b);
}

But now there is the special rule that in a return the compiler may treat the return value as a temporary, and then this would not be necessary -- a simple return b would suffice.

But then again, b has a name in this function, therefore, its an LValue -- which hinders the compiler to m consider it being a temp, and the move is required.

Is this still the case in the most recent version of the C++0x Standard? We need the move to implement the above pattern?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烟雨凡馨 2024-12-07 13:49:58

在此示例中,您需要显式 std::move,因为 b 不是非易失性自动对象的名称。参考12.8【class.copy】/p31/b1:

  • 在具有类返回类型的函数的 return 语句中,当
    表达式是非易失性自动对象的名称(其他
    比函数或 catch 子句参数)具有相同的 cv-
    非限定类型作为函数返回类型,复制/移动操作
    可以通过直接将自动对象构造到
    函数的返回值

You need the explicit std::move in this example because b is not the name of a non-volatile automatic object. Reference 12.8 [class.copy] /p31/b1:

  • in a return statement in a function with a class return type, when
    the expression is the name of a non-volatile automatic object (other
    than a function or catch-clause parameter) with the same cv-
    unqualified type as the function return type, the copy/move operation
    can be omitted by constructing the automatic object directly into the
    function’s return value
找回味觉 2024-12-07 13:49:58

我不确定为什么这个函数按值返回。该函数不应该返回如下所示的 Matrix&& 吗?

Matrix&& operator+(const Matrix &a, Matrix &&b) {
  b += a;
  return std::move(b);
}

这还有一个额外的优点,即 x1 + x2 + x3 + ... + xn 最多创建一个临时值,如果 Matrix 碰巧是堆栈分配的,这一点很重要(因为它不会从移动中获得任何收益)。

我认为签名应该如下所示:

Matrix&& operator+(Matrix &&a,      Matrix &&b     );
Matrix&& operator+(const Matrix &a, Matrix &&b     );
Matrix&& operator+(Matrix &&a,      const Matrix &b);
Matrix   operator+(const Matrix &a, const Matrix &b);

I'm not sure why this function returns by value. Shouldn't this function return a Matrix&& like the following?

Matrix&& operator+(const Matrix &a, Matrix &&b) {
  b += a;
  return std::move(b);
}

This has the added advantage that x1 + x2 + x3 + ... + xn creates at most one temporary, which is important if Matrix happens to be stack allocated (as it then gains nothing from moves).

I think the signatures should be like the following:

Matrix&& operator+(Matrix &&a,      Matrix &&b     );
Matrix&& operator+(const Matrix &a, Matrix &&b     );
Matrix&& operator+(Matrix &&a,      const Matrix &b);
Matrix   operator+(const Matrix &a, const Matrix &b);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文