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