在C 11中,方法可以重载,表示方法被调用的对象的表达式是否为左值或右值.如果我从一个通过rvalue调用的方法返回*,我需要明确地从*这个或者不是?
Foo Foo::method() && { return std::move(*this); // Is this move required or not? }
解决方法
这个类型总是一个左派:
§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如果你想调用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(我知道实现ref-qualifiers的唯一编译器),我得到以下输出:
$clang++ -std=c++0x -stdlib=libc++ -pedantic -Wall t.cpp $./a.out copy ctor // #1 move ctor // #2