在右值方法中从 *this 移动?

发布于 2024-09-05 13:55:51 字数 303 浏览 5 评论 0原文

在 C++11 中,无论调用方法的对象的表达式是左值还是右值,都可以重载方法。如果我从通过右值调用的方法返回 *this ,我是否需要显式地从 *thismove

Foo Foo::method() &&
{
    return std::move(*this);   // Is this move required or not?
}

不幸的是,我不能简单地在我的编译器上测试这个,因为 g++ 还不支持这个功能:(

In C++11, methods can be overloaded on whether or not the expression that denotes the object on which the method is called is an lvalue or an rvalue. If I return *this from a method called via an rvalue, do I need to explicitly move from *this or not?

Foo Foo::method() &&
{
    return std::move(*this);   // Is this move required or not?
}

Unfortunately, I can't simply test this on my compiler since g++ does not support this feature yet :(

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

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

发布评论

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

评论(1

浮萍、无处依 2024-09-12 13:56:07

*this 的类型始终为左值:

§9.3.2 [class.this] p1

在非静态 (9.3) 成员函数体内,关键字 this 是一个纯右值表达式,其值是函数所在对象的地址被称为。类 X 的成员函数中 this 的类型为 X*< /代码>。 [...]


§5.3.1 [expr.unary.op] p1

一元*运算符执行间接:应用它的表达式应是指向对象类型的指针,或指针到函数类型,结果是左值,引用表达式指向的对象或函数。

因此,如果您想调用移动构造函数,则需要 std::move

以下代码片段显示:

#include <iostream>
#include <utility>

struct test{
  test(){}
  test(test const&){ std::cout << "copy ctor // #1\n"; }
  test(test&&){ std::cout << "move ctor // #2\n"; }

  test f_no_move() &&{ return *this; }
  test f_move() &&{ return std::move(*this); }
};

int main(){
  test().f_no_move(); // #1
  test().f_move(); // #2
}

使用 Clang 3.1(我知道的唯一实现引用限定符的编译器),我得到以下输出:

$ clang++ -std=c++0x -stdlib=libc++ -pedantic -Wall t.cpp
$ ./a.out
复制构造函数 // #1
移动向量 // #2

The type of *this is always an lvalue:

§9.3.2 [class.this] p1

In the body of a non-static (9.3) member function, the keyword this is a prvalue expression whose value is the address of the object for which the function is called. The type of this in a member function of a class X is X*. [...]

§5.3.1 [expr.unary.op] p1

The unary * operator performs indirection: the expression to which it is applied shall be a pointer to an object type, or a pointer to a function type and the result is an lvalue referring to the object or function to which the expression points.

So you will need to std::move if you want to invoke the move constructor.

The following code snippet shows that:

#include <iostream>
#include <utility>

struct test{
  test(){}
  test(test const&){ std::cout << "copy ctor // #1\n"; }
  test(test&&){ std::cout << "move ctor // #2\n"; }

  test f_no_move() &&{ return *this; }
  test f_move() &&{ return std::move(*this); }
};

int main(){
  test().f_no_move(); // #1
  test().f_move(); // #2
}

Using Clang 3.1 (the only compiler I know that implements ref-qualifiers), I get the following output:

$ clang++ -std=c++0x -stdlib=libc++ -pedantic -Wall t.cpp
$ ./a.out
copy ctor // #1
move ctor // #2

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