簡體   English   中英

將右值引用分配給成員變量

[英]Assigning rvalue reference to member variable

我正在嘗試編寫一種有效的方法來將圖像(QImage-Qt5.3)分配給類的成員變量:

void ImageView::setImage(QImage&& image){
    std::cout << &image << std::endl;

    _image = image;
    //_image = std::move(image);

    std::cout << &_image << std::endl;

    _imageAssigned = true;
    updateResizedImage();
    update();
}

我可能會使用兩行代碼,第一行是_image = image; 第二個是_image = std::move(image); 現在,我認為第一行應該很好,並且應該實際使用QImage的= operator重載,因為它已經是右值引用,因此它需要右值引用。 但是,Visual Studio的工具提示告訴我使用了常規= operator。 如果我改用第二行,則工具提示將顯示使用右值的重載。 現在我的問題是為什么會這樣。 第一行還不夠嗎? 在已經是右值引用的變量上調用move對我來說似乎是多余的。

我試圖通過輸出指針來測試這一點(如代碼所示)。 現在,無論我使用哪一行,指針都不同。 這讓我感到困惑。 看起來,我的代碼無法按我預期的方式工作。 誰能告訴我我做錯了什么?

謝謝您的幫助

具有名稱的對象是左值。 聲明為QImage&&表示只有右值可以綁定到該引用,但是引用本身始終是左值:它有一個名稱。 如果要轉發實體的右值,則必須使用std::move()顯式地轉發。 如果推導了右值(即,您使用了T&&形式的推導模板參數,其中T是模板參數),則將使用std::forward<T>(arg)有條件地轉發右值。

image_image的地址當然是不同的,因為它們首先是不同的對象。 如果QImage包含帶有地址的對象,則可以驗證是否使用該地址移動了該對象。 例如,如果您使用std::vector<T>而不是QImage ,則可以使用類似以下內容來確定是否移動了數組:

void f(std::vector<T>&& v) {
    std::cout << (v.empty()? 0: v.data()) << '\n';
    std::vector<T> other;
    other = v; // will be copied
    std::cout << (other.empty()? 0: v.data()) << '\n';
    other = std::move(v); // will be moved
    std::cout << (other.empty()? 0: v.data()) << '\n';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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