簡體   English   中英

如何使右值方法正確調用move構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM