在 C++11 中,方法可以根据表示调用方法的对象的表达式是左值还是右值来重载。如果我从通过右值调用的方法返回 *this
,我是否需要从 *this
显式地移动
?
Foo Foo::method() &&
{
return std::move(*this); // Is this move required or not?
}
不幸的是,我不能简单地在我的编译器上测试它,因为 g++ 还不支持这个特性:(
最佳答案
*this
的类型总是一个左值:
§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 ofthis
in a member function of a classX
isX*
. [...]
§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.
因此,如果您想调用移动构造函数,则需要 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
copy ctor // #1
move ctor // #2
关于c++ - 在右值方法中从 *this 移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028632/