[英]How should I ensure the call to the move constructor? (move semantics and rvalue reference)
[英]How to make rvalue method correctly call move constructor
我有像這樣的復制和移動構造函數的基類:
class Test {
public:
Test( int i ) {
iptr = new int( i );
}
Test( const Test & other ) {
printf("copy constructor\n");
iptr = new int( *other.iptr );
}
Test( Test && other ) {
printf("move constructor\n");
iptr = other.iptr;
other.iptr = NULL;
}
virtual ~Test() {
delete iptr;
}
virtual Test * copy() {
return new Test( *this );
}
virtual Test * move() && {
return new Test( *this );
}
protected:
int * iptr;
};
我添加了一個copy和move方法,以允許多態復制並從指針移動對象,該指針可以潛在地指向某些子類的實例。
但是當我寫以下內容時
Test t1( 5 );
Test * t2 = t1.copy();
Test * t3 = Test( 6 ).move();
第一種情況正確地調用了復制構造函數,但是第二種情況也錯誤地調用了復制構造函數。
為什么構造函數重載不能正常工作,如何使它調用move構造函數?
以同樣的方式,任何右值引用參數都是函數內的左值,為其調用右值引用限定成員函數的對象是該成員函數內的左值。
void foo(Test&& x)
{
/* here x is an lvalue ! */
Test y(std::move(x)); // need explicit cast to actually move
}
因此,您需要:
virtual Test * move() && {
return new Test( std::move(*this) );
}
(不要忘記#include <utility>
。)
之所以*this
是一個左值是因為指針間接總是產生一個左值,其中this
始終是一個T*
(或者T cv *
的類型的成員函數內) T
。 盡管成員函數cv限定影響this
指針,但函數的ref限定不起作用。 (沒有“指向右值的指針”或“指向左值的指針”,只有“指向const的指針”或“指向volatile的指針”等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.