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