繁体   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