c++ opencv中Mat(Rect())返回的是ROI区域的引用还是拷贝?

如下:直接给m的左上角2*2区域赋值是不行的

#include <opencv.hpp>
using namespace cv;
int main() {
    Mat m = Mat(Size(3, 3), CV_8U,Scalar(0));
    Mat rect = Mat(Size(2,2), CV_8U,Scalar(99));
    m(Rect(0, 0, 2, 2)) =rect;
    std::cout << m << std::endl;
}

图片说明

因此,猜测m(Rect(0,0,2,2))只是传出左上角区域的拷贝,并没有把引用传出来,但是把m(Rect(0,0,2,2))=rect;改成m(Rect(0,0,2,2)+=rect;之后就可以赋值成功,所以我想问下Mat(Rect())到底是怎么操作的?
图片说明

mat是一个类,直接=,可能会取到地址。
除非opencv中对=重载,重载为成员变量的拷贝,不然应该是会取到对象的地址的。
+=应该有重载

OpenCV Mat类详解和用法_Mason_Mao的博客-CSDN博客      我们有多种方法可以获得从现实世界的数字图像:数码相机、扫描仪、计算机体层摄影或磁共振成像就是其中的几种。在每种情况下我们(人类)看到了什么是图像。但是,转换图像到我们的数字设备时我们的记录是图像的每个点的数值。      例如在上图中你可以看到车的镜子只是一个包含所有强度值的像素点矩阵。现在,我们如何获取和存储像素值可能根据最适合我们的需要而变化,最终可能减少计算机世界内的所有图... https://blog.csdn.net/Mason_Mao/article/details/82254285
这篇博客说应把简单的赋值转换到表达式中或使用 Mat::copyTo() 方法,意思是Mat(Rect())产生的是一个临时矩阵头,无法作为左值。但我也不懂为什么改为+=或者m(Rect(0,0,2,2)= m(Rect(0,0,2,2) + rectrect为什么就可以了,前者即使重载+=也没有改变 临时矩阵头无法作为左值 的结论啊。